POJ1233 Prim Kruskal

来源:互联网 发布:iptv管理系统php 编辑:程序博客网 时间:2024/06/08 19:34

还是畅通工程

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
31 2 11 3 22 3 441 2 11 3 41 4 12 3 32 4 23 4 50
 

Sample Output
35
Hint
Hint
Huge input, scanf is recommended.

要养成初始化的好习惯OTZ.....
// hdu1233.cpp : 定义控制台应用程序的入口点。////kruskal prim#include "stdafx.h"#include<iostream>#include<vector>#include<cstring>#include<algorithm>#include<queue>#define maxn 102#define inf 0x3fffffffusing 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;}

原创粉丝点击