-
题目描述:
-
省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。现得到城镇道路统计表,表中列出了任意两城镇间修建道路的费用,以及该道路是否已经修通的状态。现请你编写程序,计算出全省畅通需要的最低成本。
-
输入:
-
测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( 1< N < 100 );随后的 N(N-1)/2 行对应村庄间道路的成本及修建状态,每行给4个正整数,分别是两个村庄的编号(从1编号到N),此两村庄间道路的成本,以及修建状态:1表示已建,0表示未建。
当N为0时输入结束。
-
输出:
-
每个测试用例的输出占一行,输出全省畅通需要的最低成本。
-
样例输入:
-
3 1 2 1 0 1 3 2 0 2 3 4 0 3 1 2 1 0 1 3 2 0 2 3 4 1 3 1 2 1 0 1 3 2 1 2 3 4 1 0
-
样例输出:
-
3 1 0
- #include<iostream>
- #include<cstdio>
- #include<cmath>
- #include<algorithm>
- #include<cstdlib>
- #include<memory.h>
- #include<cstring>
- using namespace std;
- int father[101];
- int getfather(int i){
- if(father[i] == i)
- return i;
- return father[i] = getfather(father[i]);
- }
- void merge(int a, int b){
- int fa = getfather(a);
- int fb = getfather(b);
- if(fa!=fb)
- father[fa] = fb;
- }
- struct Node{
- int a, b, w;
- bool operator <(const Node&node)const{
- return w < node.w;
- }
- };
- Node nodes[5001];
- int main(){
- //freopen("in.txt", "r", stdin);
- int n, m;
- int a, b, w, s;
- int cnt;
- while(cin>>n, n){
- m = n*(n-1)/2;
- cnt = 0;
- for(int i=1;i<=n;++i){
- father[i] = i;
- }
- for(int i=0;i<m;++i){
- scanf("%d%d%d%d", &a, &b, &w, &s);
- if(s==0){
- nodes[cnt].a = a;
- nodes[cnt].b = b;
- nodes[cnt++].w = w;
- }else{
- merge(a, b);
- }
- }
- sort(nodes, nodes+cnt);
- int ans = 0;
- for(int i=0;i<cnt;++i){
- int fa = getfather(nodes[i].a);
- int fb = getfather(nodes[i].b);
- if(fa!=fb){
- merge(fa, fb);
- ans += nodes[i].w;
- }
- }
- printf("%d\n", ans);
- }
- //fclose(stdin);
- }