[題解](最小生成樹/LCA)luogu_P1967貨車運輸
一道好題不出所料又抄的題解
1.首先對於這張圖肯定要考慮走哪些邊不走哪些邊,發現我們想要的肯定那些邊權最大的邊,所以想到最大生成樹
這樣能保證選到盡量大的邊
2.跑完最大生成樹后每兩點之間就有唯一路徑了,想要知道兩點間最小邊權,可以在LCA過程中求出(我竟然不會LCA),對lca做些許改動
#include<bits/stdc++.h>
using namespace std;
const int maxn=;
const int maxm=;
struct node1{
int u,v,w;
}e1[maxm];
struct node2{
int v,w,nxt;
}e2[maxm*];
int head[maxn],cnt;
int n,m;
int dep[maxn],f[maxn],fa[maxn][],w[maxn][];
//f数组表示并查集中的父节点,fa数组表示树上的父节点,w数组表示最大载重
bool v[maxn];
void add(int u,int v,int w){
e2[++cnt].v=v;e2[cnt].w=w;e2[cnt].nxt=head[u];head[u]=cnt;
}
bool cmp(node1 x,node1 y){
return x.w>y.w;
}
int find(int x){
while(x!=f[x])x=f[x]=f[f[x]];return x;
}
void kruskal(){
sort(e1+,e1++m,cmp);
for(int i=;i<=n;i++)f[i]=i;
for(int i=;i<=m;i++){
int x=find(e1[i].u),y=find(e1[i].v);
if(x==y)continue;
f[x]=y;
add(e1[i].u,e1[i].v,e1[i].w);
add(e1[i].v,e1[i].u,e1[i].w);
}
}
void dfs(int x){
v[x]=;
for(int i=head[x];i;i=e2[i].nxt){
int y=e2[i].v;
if(v[y])continue;
dep[y]=dep[x]+;
fa[y][]=x;//儲存父節點
w[y][]=e2[i].w;
dfs(y);
}
}
int lca(int x,int y){//lca過程中求邊權最小值
if(find(x)!=find(y))return -;//不連通
int ans=0x7fffffff;
if(dep[x]>dep[y])swap(x,y);
//將y節點提升到x相同高度
for(int i=;i>=;i--)
if(dep[fa[y][i]]>=dep[x])
ans=min(ans,w[y][i]),y=fa[y][i];
if(x==y)return ans; for(int i=;i>=;i--)
if(fa[x][i]!=fa[y][i]){
ans=min(ans,min(w[x][i],w[y][i]));
x=fa[x][i];y=fa[y][i];
}
ans=min(ans,min(w[x][],w[y][]));
return ans;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)scanf("%d%d%d",&e1[i].u,&e1[i].v,&e1[i].w);
kruskal();
for(int i=;i<=n;i++)
if(!v[i]){
dep[i]=;
dfs(i);
fa[i][]=i;
w[i][]=0x7fffffff;
}
//lca初始化
for(int i=;i<=;i++)
for(int j=;j<=n;j++){
fa[j][i]=fa[fa[j][i-]][i-];
w[j][i]=min(w[j][i-],w[fa[j][i-]][i-]);
}
int q;
scanf("%d",&q);
while(q--){
int x,y;
scanf("%d%d",&x,&y);
printf("%d\n",lca(x,y));
}
}
[題解](最小生成樹/LCA)luogu_P1967貨車運輸的更多相关文章
- [題解](最小生成樹)luogu_P2916安慰奶牛
可以發現每個點經過次數恰好等於這個點的度數,所以把點權下放邊權,跑最小生成樹,原來邊權乘二在加上兩端點權,答案再加一遍起點最小點權 #include<bits/stdc++.h> #def ...
- [題解](最小生成樹)luogu_P1265
首先考虑最小生成树的模型,唯一不同的是第二种情形. 即“三个或三个以上的城市申请修建的公路成环” 考虑该情形,因为修路的申请是申请离它最近的城市,所以上述条件实质上为 “存在三个或三个以上的城市,他们 ...
- [題解]luogu P1156 垃圾陷阱
前言:[數據刪除] 來源:題解 不發題面了 首先我们来分析题目,“每个垃圾都可以用来吃或堆放”,浓浓的透露出一个背包气息.我们可以类比背包问题的放或不放.于是dp[i][j]dp[i][j]dp[i] ...
- [題解] luogu p1220 關路燈
區間dp 题目描述 某一村庄在一条路线上安装了n盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少).老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一盏一盏地关掉这些路灯. ...
- BZOJ 4883 [Lydsy2017年5月月赛]棋盘上的守卫(最小生成环套树森林)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4883 [题目大意] 在一个n*m的棋盘上要放置若干个守卫. 对于n行来说,每行必须恰好 ...
- [題解](水/數學)luogu_P1147連續自然數和
尺取法a掉 然而數學解法為 等差數列求和公式: sum(L,R)=(L+R)(R-L+1)/2=M 即(L+R)(R-L+1)=2M 可以把2M分解成两个数之积,假设分成了两个数K1,K2,且K1&l ...
- [題解](單調隊列dp)【2016noip福建夏令營】探險
P1917 -- 探险 时间限制:1000MS 内存限制:131072KB 题目描述(explore.cpp) π+e去遗迹探险,遗迹里有 N 个宝箱,有的装满了珠宝,有的装着废品. π+e ...
- [題解](二分答案/單調隊列)luogu_P1419尋找段落
果然又抄的題解... 顯然答案具有單調性,而對于平均數計算的式子我們移一下項, 若s[l..r]>mid*(r-l+1)无解, 於是我們把每個數都減去一個mid,看和的正負即可,如果為正就可能有 ...
- [題解]luogu_P1120小木棍(搜索)
好久以前抄的題解,現在重新抄題解做一下 1.對所有木棍從大到小排序,後用小的比較靈活 2.限制加入的木棍單調遞減,因為先/后用長/短木棍等價,反正就是那兩根 3.預處理出重複木棍的位置,防止重複搜索相 ...
随机推荐
- iOS 第三方登录之 QQ登录
一. 首先需要下载腾讯qq登录所需的库,下载地址是http://open.qq.com/ . 需要用到的有TencentOpenAPI.framework 和TencentOpenApi_IOS_Bu ...
- 对于pod导入第三方库文件终端语言记录
//换成 pod install --verbose --no-repo-update //生成Podfile文件 touch Podfile 加上--verbose --no-repo-update ...
- this.triggerEvent()用法
在对组件进行封装时 在当前页面想要获取组件中的某一状态,需要使用到this.triggerEvent(' ',{},{}),第一个参数是自定义事件名称,这个名称是在页面调用组件时bind的名称,第二个 ...
- nginx ,node 配置项目
nginx ,node 配置项目 1.安装好node,npm 2.安装cnpm,-g是全局的 sudo npm install -g cnpm --registry=https://registry. ...
- pycharm 开发连接linux 服务器
这样就可以了.....
- 基于aspectj实现AOP操作的两种方式——注解方式
- oracle 10g 静默安装(无图形化)
Oracle 10g无图形界面安装 此文档是在oracle环境变量已经配置完成,不缺少依赖包的情况下进行安装: 解压oracle的安装包, 首先vi database/response/enterpr ...
- CSS元素:clip属性作用说明
clip属性是一个比较有用的属性,但往往在实际应用中,并不多见,介绍的也很少.应用clip属性需要注意的两点: 一.clip属性必须和定位属性postion一起使用才能生效. 二.clip裁切的计算坐 ...
- 【221】◀▶ IDL GUI 函数说明
参考:GUI - Dialogs Routines参考:GUI - Widgets Routines参考:GUI - Compound Widgets Routines 01 DIALOG_MES ...
- POJ - 3253 Fence Repair 优先队列+贪心
Fence Repair Farmer John wants to repair a small length of the fence around the pasture. He measures ...