HDU1879(最小生成树)

解题思路:题意明确,其实是最小生成树的一种变形,可以在读取输入时将已经建设的道路的费用看做是0,然后直接寻找最小生成树,得到生成树的耗费就是最短耗费。另外注意:用cin、cout输入输出则会超时,本来以为数据量不会太大,但改用scanf和printf后就AC了。
View Code
 1 #include<stdio.h>
 2 #define MAX 0xfffffff
 3 #define max 105
 4 
 5 int map[max][max],sign[max];
 6 int main()
 7 {
 8     int n,a,b,c,d,i,j;
 9     while(scanf("%d",&n)&&n)
10     {
11         for(i=1;i<=n;i++)
12         {
13             sign[i]=0;
14             for(j=1;j<=n;j++)
15                 map[i][j]=MAX;
16         } 
17         for(i=1;i<=n*(n-1)/2;i++)
18         {
19             scanf("%d%d%d%d",&a,&b,&c,&d);
20             if(d==1) map[a][b]=map[b][a]=0;
21             else map[a][b]=map[b][a]=c;
22         }
23         int sum=0,min,u;
24         for(i=1;i<=n;i++)
25         {
26             sign[1]=1;
27             min=MAX;
28             for(j=1;j<=n;j++)
29                 if(!sign[j]&&min>map[1][j])
30                 {
31                     min=map[1][j];
32                     u=j;
33                 }
34                 sign[u]=1;
35                 if(min!=MAX) sum+=min;
36                 for(j=1;j<=n;j++)
37                     if(map[u][j]<map[1][j])
38                         map[1][j]=map[u][j];
39         }
40         printf("%d\n",sum);
41     }
42     return 0;
43 }
posted @ 2012-02-18 19:31  笑巧  阅读(696)  评论(0编辑  收藏  举报