【HDU 1879】继续畅通工程

来源:互联网 发布:计算年龄的软件 编辑:程序博客网 时间:2024/06/06 18:44

继续畅通工程

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 26464    Accepted Submission(s): 11194


Problem Description
省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。现得到城镇道路统计表,表中列出了任意两城镇间修建道路的费用,以及该道路是否已经修通的状态。现请你编写程序,计算出全省畅通需要的最低成本。
 

Input
测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( 1< N < 100 );随后的 N(N-1)/2 行对应村庄间道路的成本及修建状态,每行给4个正整数,分别是两个村庄的编号(从1编号到N),此两村庄间道路的成本,以及修建状态:1表示已建,0表示未建。

当N为0时输入结束。
 

Output
每个测试用例的输出占一行,输出全省畅通需要的最低成本。
 

Sample Input
31 2 1 01 3 2 02 3 4 031 2 1 01 3 2 02 3 4 131 2 1 01 3 2 12 3 4 10
 

Sample Output
310
 
Problem
      最小生成树裸题

Code
#include <cstdio>#include <cstring>#include <algorithm>#define maxn 105#define INF 0x3f3f3f3ftypedef long long ll;using namespace std;int fa[maxn];int tol;struct Edge{int u, v, w;}edge[maxn*maxn];void add(int u, int v, int w){edge[tol].u = u;edge[tol].v = v;edge[tol++].w = w;}int Find(int x){if (fa[x] == -1) return x;return fa[x] = Find(fa[x]);}bool cmp(Edge a, Edge b){return a.w < b.w;}int Kruskal(int n){sort(edge, edge + tol, cmp);int ans = 0, cnt = 0;for (int i = 0; i < tol; i++) {int u = edge[i].u, v = edge[i].v, w = edge[i].w;int f1 = Find(u), f2 = Find(v);if (f1 != f2) {fa[f1] = f2;ans += w;cnt++;}if (cnt == n - 1) break;}if (cnt != n - 1) return -1;return ans;}void Init(){tol = 0;memset(fa, -1, sizeof(fa));}int main(){int n, u, v, w, f, m;while (~scanf("%d", &n) && n) {Init();m = n * (n - 1) / 2;while (m--) {scanf("%d%d%d%d", &u, &v, &w, &f);if (f) add(u, v, 0);else add(u, v, w);}int ans = Kruskal(n);printf("%d\n", ans);}return 0;}