zoj 1406 Jungle Roads(简单-MST)

来源:互联网 发布:大数据培训就业多少钱 编辑:程序博客网 时间:2024/04/29 11:15

同水过,手写kruskal。

#include<iostream>#include<cstring>#include<cstdlib>#define INF 1000000#define MAXM 80#define MAXN 30#define MAXM1 20using namespace std;typedef struct edge{int u,v,w;}edge;edge edges[MAXM];int parent[MAXN];int n,m;int cmp(const void *a,const void *b){edge aa=*(const edge *)a;edge bb=*(const edge *)b;return aa.w-bb.w;}void UFset(){for(int i=0;i<n;i++)parent[i]=-1;}int Find(int x){int s;for(s=x;parent[s]>=0;s=parent[s]) ;while(s!=x){int tmp=parent[x];parent[x]=s;x=tmp;}return s;}void Union(int R1,int R2){int r1=Find(R1);int r2=Find(R2);int tmp=parent[r1]+parent[r2];if(parent[r1]>parent[r2]) {parent[r1]=r2;parent[r2]=tmp;}else {parent[r2]=r1;parent[r1]=tmp;}}int Kruskal(){int i;int u,v;int sum=0;int num=0;UFset();for(i=0;i<m;i++){u=edges[i].u;v=edges[i].v;if(Find(u)!=Find(v)){sum+=edges[i].w;Union(u,v);num++;}if(num>=n-1) break;}return sum;}int main(){int mm;char ch,ch2;int i,j;int u,v,w;while(cin>>n,n){m=0;int k=0;for(i=0;i<n-1;i++){cin>>ch;cin>>mm;m+=mm;u=ch-'A';for(j=0;j<mm;j++){cin>>ch2>>w;v=ch2-'A';edges[k].u=u;edges[k].v=v;edges[k++].w=w;}}qsort(edges,m,sizeof(edges[0]),cmp);cout<<Kruskal()<<endl;}return 0;}


原创粉丝点击