hdu 1233 还是畅通工程

还是畅通工程

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 21144    Accepted Submission(s): 9419


Problem Description
某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。
 

 

Input
测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( < 100 );随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到N编号。
当N为0时,输入结束,该用例不被处理。
 

 

Output
对每个测试用例,在1行里输出最小的公路总长度。
 

 

Sample Input
3 1 2 1 1 3 2 2 3 4 4 1 2 1 1 3 4 1 4 1 2 3 3 2 4 2 3 4 5 0
 

 

Sample Output
3 5
Hint
Hint
Huge input, scanf is recommended.
 

 

Source
 

 

Recommend
JGShining   |   We have carefully selected several similar problems for you:  1301 1325 1213 1856 1269 
 

题意:

    中文...

 

我的两种做法:

     1、最短路

 1 //234MS    248K    1011 B    G++    
 2 #include<stdio.h>
 3 #include<string.h>
 4 #define inf 0x7ffffff
 5 int g[105][105];
 6 int d[105];
 7 int vis[105];
 8 int n;
 9 int dij(int u)
10 {
11     memset(vis,0,sizeof(vis));
12     for(int i=0;i<=n;i++)
13         d[i]=g[u][i];
14     vis[u]=1;
15     int ans=0;
16     for(int i=1;i<n;i++){
17         int temp=inf;
18         int v=1;
19         for(int i=1;i<=n;i++){
20             if(!vis[i] && d[i]<temp){
21                 temp=d[i];
22                 v=i;
23             }
24         }
25         vis[v]=1;
26         ans+=d[v];
27         for(int i=1;i<=n;i++)  //此处有点不同,已选的并成一个点 
28             if(!vis[i] && d[i]>g[v][i])
29                 d[i]=g[v][i];
30     }
31     return ans; 
32 }
33 int main(void)
34 {
35     int a,b,c;
36     while(scanf("%d",&n),n)
37     {
38         for(int i=0;i<=n;i++)
39            for(int j=0;j<=n;j++)
40                g[i][j]=inf;
41         for(int i=0;i<n*(n-1)/2;i++){
42             scanf("%d%d%d",&a,&b,&c);
43             g[a][b]=g[b][a]=c;
44         }
45         printf("%d\n",dij(1));
46     }
47     return 0;
48 }
View Code

 

     2、并查集

 1 //281MS    268K    936 B    G++
 2 #include<stdio.h>
 3 #include<stdlib.h>
 4 #include<string.h>
 5 struct node{
 6     int u;
 7     int v;
 8     int l;
 9 }p[10005];
10 int set[10005];
11 int cmp(const void*a,const void*b) 
12 {
13     return (*(node*)a).l-(*(node*)b).l;
14 }
15 int find(int x)
16 {
17     if(set[x]==x) return x;
18     return find(set[x]);
19 }
20 int merge(int a,int b)
21 {
22     int x=find(a);
23     int y=find(b);
24     if(x==y) return 0;
25     if(x>y) set[x]=y;
26     else set[y]=x;
27     return 1;
28 }
29 int main(void)
30 {
31     int n,a,b,c;
32     while(scanf("%d",&n),n)
33     {
34         for(int i=0;i<=n;i++) set[i]=i;
35         for(int i=0;i<n*(n-1)/2;i++){
36             scanf("%d%d%d",&a,&b,&c);
37             p[i].u=a;
38             p[i].v=b;
39             p[i].l=c;
40         }
41         qsort(p,n*(n-1)/2,sizeof(p[0]),cmp);
42         int ans=0;
43         for(int i=0;i<n*(n-1)/2;i++)
44             if(merge(p[i].u,p[i].v)) ans+=p[i].l;
45         printf("%d\n",ans);
46     }
47     return 0;
48 }
49  
View Code

 

posted @ 2013-10-31 12:36  heaventouch  阅读(95)  评论(0)    收藏  举报