标签:
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 17822 Accepted Submission(s): 7672
题解:
克鲁斯卡尔算法;
代码:
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 const int MAXN=110; 5 int sum; 6 struct Node { 7 int s,e,d,ol; 8 }; 9 Node dt[MAXN*MAXN/2]; 10 int pre[MAXN]; 11 void initial(){ 12 memset(pre,0,sizeof(pre)); 13 memset(dt,0,sizeof(dt)); 14 } 15 int find(int x){ 16 return pre[x]= x==pre[x]?x:find(pre[x]); 17 } 18 int cmp(const void *a,const void *b){ 19 if( (*(Node *)a).ol != (*(Node *)b).ol)return (*(Node *)b).ol-(*(Node *)a).ol; 20 else return (*(Node *)a).d-(*(Node *)b).d; 21 } 22 void merge(Node a){ 23 int f1,f2; 24 if(!pre[a.s])pre[a.s]=a.s; 25 if(!pre[a.e])pre[a.e]=a.e; 26 f1=find(a.s); 27 f2=find(a.e); 28 if(f1!=f2){ 29 pre[f1]=f2; 30 if(!a.ol)sum+=a.d; 31 } 32 } 33 int main(){ 34 int N,t; 35 while(~scanf("%d",&N),N){ 36 initial();sum=0; 37 t= N*(N-1)/2; 38 int i,j; 39 for(i=0;i<t;i++) 40 scanf("%d%d%d%d",&dt[i].s,&dt[i].e,&dt[i].d,&dt[i].ol); 41 qsort(dt,t,sizeof(dt[0]),cmp); 42 for(int i=0;i<t;i++){ 43 merge(dt[i]); 44 } 45 printf("%d\n",sum); 46 } 47 return 0; 48 }
畅通工程Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 21373 Accepted Submission(s): 9196 Problem Description
省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。经过调查评估,得到的统计表中列出了有可能建设公路的若干条道路的成本。现请你编写程序,计算出全省畅通需要的最低成本。
Input
测试输入包含若干测试用例。每个测试用例的第1行给出评估的道路条数 N、村庄数目M ( < 100 );随后的 N
行对应村庄间道路的成本,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间道路的成本(也是正整数)。为简单起见,村庄从1到M编号。当N为0时,全部输入结束,相应的结果不要输出。 Output
对每个测试用例,在1行里输出全省畅通需要的最低成本。若统计数据不足以保证畅通,则输出“?”。
Sample Input
3 3 1 2 1 1 3 2 2 3 4 1 3 2 3 2 0 100
Sample Output
3 ?
|
题解:克鲁斯卡尔算法;
代码:
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 struct Node { 5 int s,e,dis; 6 }; 7 Node road[110]; 8 int pre[110]; 9 int N,M; 10 int cmp(const void *a,const void *b){ 11 return *(int *)a-*(int *)b; 12 } 13 int find(int x){ 14 return x==pre[x]?x:find(pre[x]); 15 } 16 bool merge(int x,int y){ 17 int f1,f2; 18 f1=find(x);f2=find(y); 19 if(f1!=f2){ 20 pre[f1]=f2;return true; 21 } 22 return false; 23 } 24 void initial(){memset(pre,0,sizeof(pre));} 25 int main(){ 26 while(~scanf("%d%d",&N,&M),N){ 27 for(int i=0;i<N;i++)scanf("%d%d%d",&road[i].s,&road[i].e,&road[i].dis); 28 qsort(road,N,sizeof(road[0]),cmp); 29 int num=0; 30 initial(); 31 for(int i=0;i<N;i++){ 32 if(!pre[road[i].s])pre[road[i].s]=road[i].s; 33 if(!pre[road[i].e])pre[road[i].e]=road[i].e; 34 if(merge(road[i].s,road[i].e))num+=road[i].dis; 35 }int flot=0; 36 for(int i=1;i<=M;i++){ 37 if(!pre[i]||i==pre[i])flot++; 38 if(flot>1)break; 39 } 40 if(flot>1)puts("?"); 41 else printf("%d\n",num); 42 } 43 return 0;}
标签:
原文地址:http://www.cnblogs.com/handsomecui/p/4721060.html