hdu 畅通工程

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

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 #include <algorithm>
 5 #define maxn 200
 6 using namespace std;
 7 const int inf=1<<30;
 8 
 9 int g[maxn][maxn];
10 int dis[maxn];
11 bool vis[maxn];
12 int sum;
13 int n,m,a,b,c;
14 bool flag=true;
15 
16 void prim()
17 {
18     memset(vis,false,sizeof(vis));
19     for(int i=1; i<=n; i++)  dis[i]=g[1][i];
20     dis[1]=0;
21     vis[1]=true;
22     flag=true;
23     for(int i=1; i<n; i++)
24     {
25         int m=inf,x;
26         for(int y=1; y<=n; y++) if(!vis[y]&&dis[y]<m) m=dis[x=y];
27         if(m==inf) {flag=false; break;}
28         sum+=m;
29         vis[x]=true;
30         for(int y=1; y<=n; y++) if(!vis[y]&&dis[y]>g[x][y]) dis[y]=g[x][y];
31     }
32 }
33 
34 int main()
35 {
36     while(scanf("%d%d",&m,&n)!=EOF)
37     {
38         if(m==0) break;
39         for(int i=0; i<=n; i++)
40         {
41             for(int j=0; j<=n; j++)
42             {
43                 if(i==j) g[i][j]=0;
44                 else
45                 g[i][j]=g[j][i]=inf;
46             }
47         }
48         for(int i=0; i<m; i++)
49         {
50             scanf("%d%d%d",&a,&b,&c);
51             g[a][b]=g[b][a]=c;
52         }
53         sum=0;
54         flag=true;
55         prim();
56         if(!flag) printf("?\n");
57         else
58         printf("%d\n",sum);
59     }
60     return 0;
61 }
View Code

 

posted @ 2014-04-14 22:13  null1019  阅读(164)  评论(0编辑  收藏  举报