标签:
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 14910 Accepted Submission(s): 6458
1 #include<algorithm> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 #define M 110 6 #define X 5050 7 struct villge 8 { 9 int a,b,money; 10 }N[X];///定义村庄结构体 11 int dis[M],sum;///用sum储存路程 12 bool vid[M];///因为路径较多所以建立一个标记数组来节约下时间 13 int find(int x) 14 { 15 int t=x; 16 while(dis[x]!=x) 17 x=dis[x]; 18 dis[t]=x; 19 return x; 20 } 21 bool cmp(villge a,villge b) 22 { 23 return a.money<b.money; 24 } 25 void father(villge x) 26 { 27 int a=find(x.a); 28 int b=find(x.b); 29 if(a!=b) 30 { 31 sum+=x.money; 32 dis[a]=b; 33 vid[x.a]=1; 34 vid[x.b]=1; 35 } 36 return; 37 } 38 int main() 39 { 40 int i,j,n,t,a,b,c,d,x; 41 while(scanf("%d",&n)&&n) 42 { 43 for(i=0;i<M;i++) 44 dis[i]=i; 45 memset(vid,0,sizeof(vid)); 46 sum=0; 47 t=n*(n-1)/2; 48 x=0; 49 for(i=0;i<t;i++) 50 { 51 scanf("%d%d%d%d",&a,&b,&c,&d);///并入 52 if(d){ 53 int q,w; 54 q=find(a); 55 w=find(b); 56 if(q!=w) 57 dis[q]=w; 58 vid[a]=vid[b]=1; 59 }///这里题目是当d为1时代表已经建好的,必须先写入,这里我wa了2次 60 else{ 61 N[x].a=a; 62 N[x].b=b; 63 N[x++].money=c; 64 } 65 } 66 sort(N,N+x,cmp); 67 for(i=0;i<t;i++) 68 { 69 if(vid[N[i].a]!=1||vid[N[i].b]!=1) 70 father(N[i]); 71 } 72 printf("%d\n",sum); 73 } 74 return 0; 75 } 76 /********************************************** 77 代码有点丑不要在意这些细节 78 ***********************************************/
标签:
原文地址:http://www.cnblogs.com/LQBZ/p/4246770.html