[題解](最小生成樹/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.預處理出重複木棍的位置,防止重複搜索相 ...
随机推荐
- 03-树2 List Leaves(25 point(s)) 【Tree】
03-树2 List Leaves(25 point(s)) Given a tree, you are supposed to list all the leaves in the order of ...
- Xcode工程断点调试失效
1.我解决的是方法是,选择Product---->Edit Scheme------>(这里进入后会有Info,Arguments,Options,Diagnostics)选择Info-- ...
- Break、Continue、Return区别
1)break 直接跳出当前的循环,从当前循环外面开始执行,忽略循环体中任何其他语句和循环条件测试.他只能跳出一层循环,如果你的循环是嵌套循环,那么你需要按照你嵌套的层次,逐步使用break来 ...
- Hihocoder #1121 二分图一•二分图判定( bfs或者dfs搜索实现 搜索的过程中进行 节点标记 *【模板】)
对于拿到的相亲情况表,我们不妨将其转化成一个图.将每一个人作为一个点(编号1..N),若两个人之间有一场相亲,则在对应的点之间连接一条无向边.(如下图) 因为相亲总是在男女之间进行的,所以每一条边的两 ...
- IOC入门1
1.配置文件 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http:/ ...
- Sublime Text 相关教程(转)
曾经有人说过,世界上有两种编辑器,好用和不好用的:而在好用的编辑器中,又分两种,免费的和死贵死贵的.譬如说VIM 和 TextMate,就是免费和死贵的典型.很不幸,今天的主角 Sublime Tex ...
- hdu-2157 How many ways??(矩阵快速幂)
题目链接: How many ways?? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O ...
- Pyhton:汉诺塔游戏
#汉诺塔游戏攻略! def hanoi(n,x,y,z): if n == 1: print(x,'-->',z) else: hanoi(n-1,x,z,y) #将前n-1个盘子从x移动到y上 ...
- apache web 服务器
0. 特性与特点 性能方面,apache 在设计时采用了以"进程"为基础的结构,自然进程比线程消耗了更多的系统开销,导致了 apache 在多处理器环境中性能有所下降: 因此,在对 ...
- ZOJ3496 Assignment
传送门 这题也是真恶心-- 题目大意是俩公司要运货,每条路有容量上限.然后B公司手里有p个--(技能点?)如果在一条路上放了x个技能点,这条路经过了y个货物,那么B公司就会收x*y的钱.现在要求的是, ...