HDU 5253 最小生成树(kruskal)+ 并查集
生活随笔
收集整理的這篇文章主要介紹了
HDU 5253 最小生成树(kruskal)+ 并查集
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接
?
#include<cstdio> #include<cmath> #include<cstring> #include<algorithm> #define N 1000010 using namespace std; struct node {int a;//端點1int b;//端點2int num;//權值 }; bool cmp(node x,node y)//按權值升序 {return x.num<y.num; } int maps[1003][1003]; node edge[N*2];//邊數=2mn-m-n<2mn int father[N]; int r[N]; int finds(int x) {if(father[x]!=x)father[x]=finds(father[x]);return father[x]; } void connect(int a,int b) {if(r[a]>r[b])father[b]=a;else if(r[a]<r[b])father[a]=b;else{father[a]=b;r[b]++;} } int main() {int T,cas=1,n,m,ans,id;int i,j;scanf("%d",&T);while(T--){int numedge=0;//邊數ans=0;memset(r,0,sizeof(r));scanf("%d%d",&n,&m);for(i=1;i<=n;i++){for(j=1;j<=m;j++)scanf("%d",&maps[i][j]);}for(i=1;i<=n;i++){for(j=1;j<=m;j++){id=(i-1)*m+j;father[id]=id;if(i<n)//除最后一行外{numedge++;edge[numedge].a=id;edge[numedge].b=i*m+j;edge[numedge].num=abs(maps[i][j]-maps[i+1][j]);}if(j<m)//除最后一列外{numedge++;edge[numedge].a=id;edge[numedge].b=(i-1)*m+j+1;edge[numedge].num=abs(maps[i][j]-maps[i][j+1]);}}}sort(edge+1,edge+numedge+1,cmp);//權值排序for(i=1;i<=numedge;i++){int x=finds(edge[i].a);int y=finds(edge[i].b);if(x!=y){connect(x,y);ans+=edge[i].num;}}printf("Case #%d:\n%d\n",cas++,ans);}return 0; }?
?
轉載于:https://www.cnblogs.com/westwind1005/p/5975231.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的HDU 5253 最小生成树(kruskal)+ 并查集的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网络基本功系列:细说网络那些事儿
- 下一篇: Ymordem学习使用