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

 

你可能感兴趣的:(HDU)