还是畅通工程
Time Limit : 4000/2000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Submission(s) : 69 Accepted Submission(s) : 56 Font: Times New Roman | Verdana | Georgia Font Size: ← → Problem Description 某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。 Input 测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( < 100 );随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到N编号。 当N为0时,输入结束,该用例不被处理。 Output 对每个测试用例,在1行里输出最小的公路总长度。 Sample Input 3 1 2 1 1 3 2 2 3 4 4 1 2 1 1 3 4 1 4 1 2 3 3 2 4 2 3 4 5 0 Sample Output 3 5 Hint Hint Huge input, scanf is recommended. Source 浙大计算机研究生复试上机考试-2006年
#include<iostream> #include<cstdio> #include<iomanip> #include<cstring> #include<algorithm> #include<queue> #define INF 9999999 #define maxnum 1500 using namespace std; int n; struct node { int s; int e; int w; }map[maxnum]; int vis[maxnum]; int dis[maxnum]; int mp[maxnum][maxnum]; //int vis2[maxnum][maxnum]; bool operator < (const node &a, const node &b) { return a.w > b.w; } int prim() { memset(vis, 0, sizeof(vis)); priority_queue<node> q; node nn; int total = 1; int s = 1; vis[1] = 1; int sum = 0; for (int j = 1;j <= n;j++) { if (j == s) continue; nn.s = s; nn.e = j; nn.w = mp[nn.s][nn.e]; q.push(nn); } while (total < n) { nn = q.top(); //cout << nn.w << " "; q.pop(); if (vis[nn.e]) continue; total++; vis[nn.e] = 1; sum += nn.w; s = nn.e; for (int j = 1;j <= n;j++) { if (j == s) continue; if (!vis[j]) { nn.s = s; nn.e = j; nn.w = mp[nn.s][nn.e]; q.push(nn); } } } return sum; } int main() { int x, y, z; while (cin >> n&&n) { for (int i = 1;i <= n;i++) { for (int j = 1;j <= n;j++) { mp[i][j] = INF; } } for (int i = 1;i <= n*(n-1)/2;i++) { cin >> x >> y >> z; mp[x][y] = z; mp[y][x] = z; } cout << prim() << endl; } return 0; }