题目描述:
省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。经过调查评估,得到的统计表中列出了有可能建设公路的若干条道路的成本。现请你编写程序,计算出全省畅通需要的最低成本。
输入:
测试输入包含若干测试用例。每个测试用例的第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 }
转载于:https://www.cnblogs.com/zjushuiping/archive/2012/05/30/2526827.html