bzoj3732: Network(倍增LCA+最小生成树)
2017-11-27 12:41
459 查看
题目传送门
好题呀。
解法:
没学过倍增LCA看这里
看到Rose跟亮哥都在做这题。
也跑去看了一下。
看了一下,想了一会儿,最长边最小?
那肯定满足最小生成树呀。。。。
所以说把最小生成树建出来然后跑lca不就完了吗。
打完之后发现诶我不会lca求路径最大值诶我只会求距离。。
肉dalao告诉我在跳lca的时候记录最大值就可以了。
然后就A了。。
代码实现:
好题呀。
解法:
没学过倍增LCA看这里
看到Rose跟亮哥都在做这题。
也跑去看了一下。
看了一下,想了一会儿,最长边最小?
那肯定满足最小生成树呀。。。。
所以说把最小生成树建出来然后跑lca不就完了吗。
打完之后发现诶我不会lca求路径最大值诶我只会求距离。。
肉dalao告诉我在跳lca的时候记录最大值就可以了。
然后就A了。。
代码实现:
#include<cstdio> #include<cstring> #include<cstdlib> #include<iostream> #include<algorithm> #include<cmath> #include<queue> using namespace std; struct node {int x,y,d,next;}a[61000],e[61000];int len,last[15100]; bool cmp(node n1,node n2) {return n1.d<n2.d;} void ins(int x,int y,int d) {len++;a[len].x=x;a[len].y=y;a[len].d=d;a[len].next=last[x];last[x]=len;} int fa[31000];int findfa(int x) {if(fa[x]!=x)fa[x]=findfa(fa[x]);return fa[x];} int mn[21][31000],dep[31000],bin[21],n,m,maxn[21][31000];//maxn[j][i]表示i往上跳2^j的时候整条路经的最大值。 void dfs(int x) { for(int k=last[x];k;k=a[k].next) { int y=a[k].y; if(y!=mn[0][x]) {dep[y]=dep[x]+1;mn[0][y]=x;maxn[0][y]=a[k].d;dfs(y);} } } void work() { bin[0]=1;for(int i=1;i<=20;i++)bin[i]=bin[i-1]*2; for(int j=1;j<=20;j++)for(int i=1;i<=n;i++)if(dep[i]>=bin[j]){mn[j][i]=mn[j-1][mn[j-1][i]];maxn[j][i]=max(maxn[j-1][i],maxn[j-1][mn[j-1][i]]);} } int lca(int x,int y) { if(dep[x]>dep[y])swap(x,y);int ans=0; for(int i=20;i>=0;i--)if(dep[y]-dep[x]>=bin[i]) {ans=max(ans,maxn[i][y]);y=mn[i][y];} if(x==y)return ans; for(int i=20;i>=0;i--)if(dep[x]>=bin[i]&&mn[i][x]!=mn[i][y]){ans=max(ans,max(maxn[i][x],maxn[i][y]));x=mn[i][x],y=mn[i][y];} return max(ans,max(maxn[0][x],maxn[0][y])); } int main() {int K; scanf("%d%d%d",&n,&m,&K); for(int i=1;i<=m;i++)scanf("%d%d%d",&e[i].x,&e[i].y,&e[i].d); sort(e+1,e+1+m,cmp); int t=0;for(int i=1;i<=n;i++)fa[i]=i; for(int i=1;i<=m;i++) { int xx=findfa(e[i].x),yy=findfa(e[i].y); if(xx!=yy) {fa[xx]=yy;ins(e[i].x,e[i].y,e[i].d);ins(e[i].y,e[i].x,e[i].d);t++;if(t==n-1)break;} } mn[0][1]=0;dep[1]=0;maxn[0][1]=0;dfs(1);work(); for(int i=1;i<=K;i++) {int x,y;scanf("%d%d",&x,&y);printf("%d\n",lca(x,y));} return 0; }
相关文章推荐
- 【bzoj3732】Network 最小生成树+倍增LCA
- bzoj3732 Network 最小生成树+LCA+树上倍增
- BZOJ 3732 Network —— 最小生成树 + 倍增LCA
- bzoj3732(同货车运输,倍增lca+最小生成树)
- 【bzoj4242】水壶 BFS+最小生成树+倍增LCA
- Codeforces Round #423 Div. 2 F. Best Edge Weight (倍增法lca)(最小生成树mst)
- 【BZOJ】【P3732】【Network】【题解】【最小生成树+倍增】
- BZOJ 3732: Network(最小生成树+倍增)
- CodeForces 609E Minimum spanning tree for each edge (lca+最小生成树+倍增)
- codeforces 733 F. Drivers Dissatisfaction(最小生成树+lca+倍增去环)
- UVa 11354 Bond 最小生成树+LCA倍增
- BZOJ3732:Network(LCT与最小生成树)
- UVA 11354 Bond(最小生成树+lca+倍增求祖先节点)
- BZOJ 3732: Network 最小生成树 倍增
- 【BJOI2010】次小生成树-最小生成树+倍增LCA
- HYSBZ - 3732 最小生成树+倍增Lca
- HDU 4081 Qin Shi Huang's National Road System 最小生成树+倍增求LCA
- 【bzoj3732】 network 最小生成树+lca
- 2015 年 蓝桥杯 A 组 C/C++ 第十题 灾后重建 【最小生成树 + LCA倍增 + 线段树维护区间max】
- gym 101081 gym F. Auction of Services 最小生成树+倍增LCA