还是畅通工程
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 49358 Accepted Submission(s): 22539
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 Output3 5Huge input, scanf is recommended.HintHint
要养成初始化的好习惯OTZ.....
// hdu1233.cpp : 定义控制台应用程序的入口点。 // //kruskal prim #include "stdafx.h" #include<iostream> #include<vector> #include<cstring> #include<algorithm> #include<queue> #define maxn 102 #define inf 0x3fffffff using namespace std; struct node { int u, v, d; node(int uu=-1, int vv=-1, int dd=-1) { u = uu, v = vv, d = dd; } bool operator <(const node& b)const { return d > b.d; //最小堆 } }; int map[maxn][maxn],fa[maxn],vis[maxn]; int dis[maxn]; vector<node> edges; vector<node>G[maxn]; vector<node>::iterator it; int N; int find(int s) { if (fa[s] == s) { return s; } return fa[s] = find(fa[s]); } void kruskal() { sort(edges.begin(), edges.end()); int len = edges.size(); for (int i = 1; i <= N; i++) { fa[i] = i; } int num = 0,ans = 0; for (int i = 0; i < len; i++) { node a = edges[i]; int f1 = find(a.u), f2 = find(a.v); if (f1 == f2) { continue; } //cout << a.u << " " << a.v << " " << a.d << endl; num++; ans += a.d; fa[f1] = f2; if (num == N - 1) { break; } } cout << ans << endl; } void prim() { priority_queue<node>Q; for (int i = 1; i <= N; i++) { dis[i] = inf; } memset(vis, 0, sizeof(vis)); Q.push(node(0, 1, 0)); int num = 0,ans = 0; while (!Q.empty()) { node a= Q.top(); Q.pop(); if (vis[a.v]) { continue; } vis[a.v] = 1; ans += a.d; int u = a.v, d = a.d; for (it = G[u].begin();it!=G[u].end();it++){ int vv = it->v; int dd = it->d; if (dis[vv] > dd) { Q.push(node(it->u,it->v,it->d)); dis[vv] = dd; } } } cout << ans << endl; } int main() { int u, v, d; while (~scanf("%d", &N),N) { edges.clear(); //清空清空!!! for (int i = 1; i <= N; i++) { G[i].clear();//清空清空!!! } for (int i = 1; i <= N*(N-1)/2; i++) { scanf("%d%d%d", &u,&v,&d); G[u].push_back(node(u,v,d)); //edges.push_back(node(u, v, d)); G[v].push_back(node(v, u, d)); } //kruskal(); prim(); } return 0; }
POJ1233 Prim Kruskal
最新推荐文章于 2021-07-29 19:22:22 发布