ACM 继续畅通工程

Problem Description
省*“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。现得到城镇道路统计表,表中列出了任意两城镇间修建道路的费用,以及该道路是否已经修通的状态。现请你编写程序,计算出全省畅通需要的最低成本。
 
Input
测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( 1< N < 100 );随后的 N(N-1)/2 行对应村庄间道路的成本及修建状态,每行给4个正整数,分别是两个村庄的编号(从1编号到N),此两村庄间道路的成本,以及修建状态:1表示已建,0表示未建。

当N为0时输入结束。

 
Output
每个测试用例的输出占一行,输出全省畅通需要的最低成本。
 
Sample Input
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
 
Sample Output
3
1
0
 
Author
ZJU
 
Source
 
 #include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
struct node
{
int a,b,v;
}loab[]; int parent[]; void init()
{
for(int i = ; i < ; i++)
parent[i] = i;
} int find(int n)
{
if(parent[n] == n)
return n;
else
return find(parent[n]);
} bool merge(int a,int b)
{
a = find(a);
b = find(b);
if(a != b)
{
parent[b] = a;
return true;
}else{
return false;
}
} bool cmp(node a,node b) //sort函数定义
{
return a.v < b.v;
}
int main()
{
int n,flag,t;
/*
~scanf("%d",&n)&&n
*/
while(cin>>n&&n)
{ init(); //parent数组初始化
t = n*(n-)/;
for(int i = ; i < t; i++)
{
//cin>>loab[i].a>>loab[i].b>>loab[i].v>>flag; //使用cin输入时 会TLE
scanf("%d%d%d%d",&loab[i].a,&loab[i].b,&loab[i].v,&flag);
if(flag) //当道路已经建成时把值重设为0,这样把问题给简单化
loab[i].v = ;
}
sort(loab,loab+t,cmp);
int sum = ;
for(int i = ; i < t; i++)
{
bool temp = merge(loab[i].a,loab[i].b); //构建最小生成树
if(temp) //只取道路成本较小的
sum += loab[i].v;
}
cout << sum <<endl;
}
return ;
}
上一篇:uiautomator 代码记录 : 随机发送短信


下一篇:java多线程快速入门(十九)