poj1258(最小生成树 kruskal算法)

来源:互联网 发布:天刀捏脸数据金木研 编辑:程序博客网 时间:2024/06/07 15:35

Sample Input

40 4 9 214 0 8 179 8 0 1621 17 16 0

Sample Output

28

/*题目意思:有N个城市,用邻接矩阵给出两两之间的距离。然后求最小生成树的权值之和 */#include<cstdio>#include<iostream>#include<algorithm>using namespace std;const int mx=500*500+10;struct node{int u,v,w;bool operator<(node t)const{return w<t.w;}//后面那个const还是最好不要少 }edge[mx];int n,m;int f[mx];int find(int x){int t=x;while(x!=f[x]) x=f[x];return f[t]=x;}int kruskal(){int ans=0,cnt=0,fx,fy;for(int i=0;i<m;i++)f[i]=i;for(int i=0;i<m;i++){fx=find(edge[i].u),fy=find(edge[i].v);if(fx!=fy){f[fx]=fy;cnt++;ans+=edge[i].w;if(cnt==n-1) return ans;}}}int main(){while(~scanf("%d",&n)){int w;m=0;for(int i=0;i<n;i++)for(int j=0;j<n;j++){scanf("%d",&w);if(w)edge[m].w=w,edge[m].u=i,edge[m++].v=j;}sort(edge,edge+m);printf("%d\n",kruskal());}return 0;}


原创粉丝点击