畅通工程(2007)

题目描述:
    省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。经过调查评估,得到的统计表中列出了有可能建设公路的若干条道路的成本。现请你编写程序,计算出全省畅通需要的最低成本。
输入:
    测试输入包含若干测试用例。每个测试用例的第1行给出评估的道路条数 N、村庄数目M (N, M < =100 );随后的 N 行对应村庄间道路的成本,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间道路的成本(也是正整数)。为简单起见,村庄从1到M编号。当N为0 时,全部输入结束,相应的结果不要输出。
输出:
    对每个测试用例,在1行里输出全省畅通需要的最低成本。若统计数据不足以保证畅通,则输出“?”。
样例输入:
3 3
1 2 1
1 3 2
2 3 4
1 3
2 3 2
0 100
样例输出:
3
?

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cstdlib>
  4 #include <cmath>
  5 #include <cctype>
  6 #include <cstring>
  7 
  8 #include <vector>
  9 #include <deque>
 10 #include <list>
 11 #include <map>
 12 #include <set>
 13 #include <stack>
 14 #include <queue>
 15 #include <algorithm>
 16 #include <string>
 17 
 18 
 19 #define MAXD 99999999
 20 using namespace std;
 21 
 22 int g[101][101];
 23 
 24 int vis[101];
 25 
 26 int lowcost[101];
 27 
 28 
 29 
 30 
 31 int main()
 32 {
 33 int n,m;
 34 
 35 int i,j,k;
 36 
 37 while(scanf("%d%d",&m,&n)!=EOF)
 38 {
 39     if(m==0)
 40         break;
 41 
 42     for(i=1;i<=n;i++)
 43         for(j=1;j<=n;j++)
 44             g[i][j]=MAXD;
 45 
 46 
 47 
 48     for(i=0;i<m;i++)
 49     {
 50 
 51         int a,b,c;
 52 
 53         scanf("%d%d%d",&a,&b,&c);
 54 
 55         if(g[a][b]>c)
 56         {g[a][b]=g[b][a]=c;}
 57 
 58     }
 59 
 60 
 61     int mincost=0;
 62 
 63     for(i=1;i<=n;i++)
 64     {
 65         vis[i]=0;
 66         lowcost[i]=g[1][i];
 67     }
 68 
 69 
 70     vis[1]=1;
 71 
 72     int tag=0;
 73 
 74 
 75 
 76     for(i=1;i<n;i++)
 77     {
 78         k=-1;
 79         int temp=MAXD;
 80 
 81         for(j=1;j<=n;j++)
 82         {
 83             if(vis[j]==0)
 84             {
 85                 if(temp>lowcost[j])
 86                 {
 87                     k=j;temp=lowcost[j];
 88                 }
 89             }
 90         }
 91 
 92         if(k==-1)
 93         {tag=1;break;}
 94 
 95         vis[k]=1;
 96 
 97         mincost+=lowcost[k];
 98 
 99 
100         for(j=1;j<=n;j++)
101         {
102             if(vis[j]==0)
103             {
104                 if(lowcost[j]>g[k][j])
105                 {lowcost[j]=g[k][j];}
106             }
107         }
108     }
109 
110 
111     if(tag==0)
112     {
113         cout<<mincost<<endl;
114     }
115     else
116     {
117         cout<<"?"<<endl;
118     }
119 }
120 
121 
122 
123 
124 
125     return 0;
126 }

 

posted @ 2012-05-30 20:30  cseriscser  阅读(257)  评论(0编辑  收藏  举报