[題解](最小生成樹/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.預處理出重複木棍的位置,防止重複搜索相 ...
随机推荐
- hibernate双向关联
双向关联中最好的设置是一端为inverse=true,一端为inverse=false. falses维护,true不维护,设置多的一方维护(false) inverse属性就是用来规定是由谁来维护这 ...
- UIBezierPath(转)
@import url(/css/cuteeditor.css); @import url(/css/cuteeditor.css); @import url(http://i.cnblogs.com ...
- RabbitMQ的介绍与spring整合
本文主要讲述的是个人参考官网及其他前辈博客,对RabbitMQ的一些理解与spring整个RabbitMQ. 一.RabbitMQ的介绍 1.1.什么是RabbitMQ RabbitMQ是一个由erl ...
- CSS动画硬件加速
http://zencode.in/14.CSS%E5%8A%A8%E7%94%BB%E7%9A%84%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96.html http:// ...
- HDU4372 Count the Buildings —— 组合数 + 第一类斯特林数
题目链接:https://vjudge.net/problem/HDU-4372 Count the Buildings Time Limit: 2000/1000 MS (Java/Others) ...
- JMeter参数化设置——通过函数助手
Now you can know everything in the world, but the only way you're findin' out that one is by givin' ...
- BZOJ_3887_[Usaco2015 Jan]Grass Cownoisseur_强连通分量+拓扑排序+DP
BZOJ_3887_[Usaco2015 Jan]Grass Cownoisseur_强连通分量+拓扑排序+DP Description In an effort to better manage t ...
- js 常见的小数取整问题
1.四舍五入取整 Math.round(5/2) // 3 2.直接去掉小数,取整 parseInt(5/2); // 2 3.向上取整,有小数整数部分就加1 Math.ceil(1/3 ...
- JNI之JAVA调用C++接口
1.JNI定义(来自百度百科) JNI是Java Native Interface的缩写,中文为JAVA本地调用.从Java1.1开始,Java Native Interface(JNI)标准成为ja ...
- bzoj 3160 万径人踪灭 —— FFT
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3160 求出关于一个位置有多少对对称字母,如果 i 位置有 f[i] 对,对答案的贡献是 2^ ...