hdu 1233还是畅通工程

http://acm.hdu.edu.cn/showproblem.php?pid=1233

View Code
 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<string.h>
 4 #define INIT 0x7ffffff
 5 int Graph[110][110];
 6 int vis[110],dis[110];
 7 int town,road;
 8 int sum;
 9 int count;
10 void prime()
11 {
12     memset(vis,0,sizeof(vis));
13     memset(dis,INIT,sizeof(dis));
14     int i,j;
15     int min;
16     sum=0;
17     count=1;
18     int now;
19     for(i=1;i<=town;i++)
20     dis[i]=Graph[1][i];
21     for(j=2;j<=town;j++)
22     {
23         min=INIT;
24         for(i=2;i<=town;i++)
25         {
26             if(min>dis[i]&&vis[i]==0)
27             {
28                 min=dis[i];
29                 now=i;
30             }
31         }
32         if(min!=INIT)
33         {
34             count++;
35             sum+=min;
36             vis[now]=1;
37             for(i=1;i<=town;i++)
38             {
39                 if(vis[i]==0&&Graph[now][i]!=0&&dis[i]>Graph[now][i])
40                 dis[i]=Graph[now][i];
41             }
42         }
43         else return;
44     }
45 }
46 int main()
47 {
48     int road;
49     int a,b,c;
50     while(~scanf("%d",&town),town)
51     {
52         road=town*(town-1)/2;
53         for(int i=1;i<=town;i++)
54         {
55             for(int j=1;j<=town;j++)
56             {
57                 if(i==j) Graph[i][j]=0;
58                 else Graph[i][j]=INIT;
59             }
60         }
61         for(int i=1;i<=town;i++)
62         {
63             for(int j=i+1;j<=town;j++)
64             {
65                 scanf("%d%d%d",&a,&b,&c);
66                 Graph[a][b]=c;
67                 Graph[b][a]=c;
68             }
69         }
70         prime();
71         if(count==town)
72         printf("%d\n",sum);
73         else printf("不用考虑?\n");
74     }
75 }
View Code
 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 int root[110];
 4 struct Node
 5 {
 6     int start;
 7     int end;
 8     int len;
 9 }node[5010];
10 int cmp(const void*x,const void*y)
11 {
12     return (*(Node*)x).len>(*(Node*)y).len?1:-1;
13 }
14 int find(int x)
15 {
16     int r=x;
17     while(r!=root[r])
18     r=root[r];
19     
20     return r;
21 }
22 void merge(int x,int y)
23 {
24     int fx,fy;
25     fx=find(x);
26     fy=find(y);
27     if(fx!=fy) root[fx]=fy;
28 }
29 int main()
30 {
31     int n;
32     int m;
33     int k;
34     int a,b,c;
35     while(~scanf("%d",&n),n)
36     {
37         for(int i=1;i<=n;i++)
38         root[i]=i;
39         k=0;
40         m=n*(n-1)/2;
41         for(int i=0;i<m;i++)
42         {
43             scanf("%d%d%d",&a,&b,&c);
44             
45             node[k].start=a;
46             node[k].end=b;
47             node[k].len=c;
48             k++;
49             
50         }
51         int sum=0;
52         qsort(node,k,sizeof(node[0]),cmp);//node[0]写成node,囧。。。 
53         for(int i=0;i<k;i++)
54         {
55             if(find(node[i].start)!=find(node[i].end))
56             {
57                 merge(node[i].start,node[i].end);
58                 sum+=node[i].len;
59             }
60         }
61         
62         int count=0;
63         for(int i=1;i<=n;i++)
64         root[i]=find(i);
65         for(int i=1;i<=n;i++)
66         if(root[i]==i) count++;
67         if(count>1) printf("DBL\n");
68         else printf("%d\n",sum);
69     }
70 }

 

posted on 2012-08-13 16:48  仁者无敌8勇者无惧  阅读(120)  评论(0编辑  收藏  举报

导航