题目链接:连接的管道
题面:
2 4 3 9 12 4 7 8 56 32 32 43 21 12 12 2 3 34 56 56 12 23 4
Case #1: 82 Case #2: 74
解题:
建一张图,求最小生成树。不过貌似搜索的方法要好一些,算是水过吧,没能充分利用一个点只与周围四点相连这个条件。
代码:
#include <iostream> #include <cstdio> #include <algorithm> using namespace std; int map[1005][1005]; struct set { int parent; int rank; }elem[1000000+10]; void init(int x) { int i; for(i=1;i<=x;i++) { elem[i].parent=i; elem[i].rank=1; } } struct edge { int a,b,val; }storage[2000000+10]; bool cmp(edge a,edge b) { return a.val<b.val; } int Find(int x) { int root,temp; temp=x; while(x!=elem[x].parent) //寻找根节点 x=elem[x].parent; root=x; x=temp; while (x!=elem[x].parent) //压缩路径,全部赋值为根节点的值 { temp=elem[x].parent; elem[x].parent=root; x=temp; } return root; } void Union(int a,int b) //合并两个集合 { int x,y; x=Find(a); y=Find(b); if(elem[x].rank>=elem[y].rank) { elem[y].parent=elem[x].parent; elem[x].rank+=elem[y].rank; } else { elem[x].parent=elem[y].parent; elem[y].rank+=elem[x].rank; } } int main() { int t,n,m,cnt,total,num,ans,ccnt,aa,bb; scanf("%d",&t); for(int i=1;i<=t;i++) { printf("Case #%d:\n",i); cnt=ccnt=ans=0; scanf("%d%d",&n,&m); //total=(n*m*4-4*2-(n-2)-(m-2))/2;总边数 num=n*m; init(num); for(int j=1;j<=n;j++) { for(int k=1;k<=m;k++) scanf("%d",&map[j][k]); } for(int j=1;j<n;j++) { int hang=(j-1)*m; for(int k=1;k<m;k++) { storage[cnt].a=hang+k; storage[cnt].b=hang+k+1; storage[cnt++].val=abs(map[j][k]-map[j][k+1]); storage[cnt].a=hang+k; storage[cnt].b=hang+m+k; storage[cnt++].val=abs(map[j][k]-map[j+1][k]); } storage[cnt].a=hang+m; storage[cnt].b=hang+m+m; storage[cnt++].val=abs(map[j][m]-map[j+1][m]); } //cout<<"cnt: "<<cnt<<endl; for(int j=1;j<m;j++) { storage[cnt].a=(n-1)*m+j; storage[cnt].b=(n-1)*m+j+1; storage[cnt++].val=abs(map[n][j]-map[n][j+1]); } sort(storage,storage+cnt,cmp); //cout<<"Edge: "<<cnt<<" "<<total<<endl; for(int j=0;j<cnt;j++) { aa=storage[j].a; bb=storage[j].b; int t1=Find(aa); int t2=Find(bb); if(t1!=t2) { Union(aa,bb); ans+=storage[j].val; ccnt++; } if(ccnt==num-1) break; } printf("%d\n",ans); } return 0; }
原文地址:http://blog.csdn.net/david_jett/article/details/46352007