题目大意:
省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。现得到城镇道路统计表,表中列出了任意两城镇间修建道路的费用,以及该道路是否已经修通的状态。现请你编写程序,计算出全省畅通需要的最低成本。
输入:
有多个测试实例,每个实例的第一行输入一个正整数N代表村庄的数目,然后接下来的N*(N-1)行每行包括4个整数,前两个代表两个村庄的编号,然后下一个是这两个村庄间修路的费用,最后一个是这两个村庄间是否已经有公路,注意:最后一个只能输入1或0,1代表已修,0代表未修。
输出:
每行一个整数
解题思路:
这道题和那一道求最短距离的差不多,只是这道题给了村庄间公路是否已修,上一道是假设每个村庄间都没有公路,然后这一道就多了这么个条件,这两道题差不多,唯一的不同就是上一道在初始化节点数组P的时候只是p[i]=i,然而这一道需要再补充一句,if (road[i].finish == 1)p[road[i].x] = p[road[i].y],如果两个村庄的公路已经修好了的话,p[road[i].x] = p[road[i].y]代表这两个节点已经合并。但是我不知道为什么提交的时候总是超时,找了很多原因就是不知道哪里错了。
代码如下:
#include<iostream>
#include<algorithm>
using namespace std;
struct Road
{
int x;
int y;
int money;
int finish;
};
Road road[200];
int p[100];
int sum;
bool Judge(Road &r1, Road &r2)
{
return r1.money < r2.money;
}
int findx(int x)
{
int r = x;
if (p[x] == r)
return r;
else
return findx(p[x]);
}
void merge(int x, int y, int z)
{
int fx = findx(x);
int fy = findx(y);
if (fx != fy&&road[z].finish == 0)
{
sum += road[z].money;
p[fx] = fy;
}
}
int main()
{
int n, m;
while (cin >> n)
{
if (n == 0)
break;
m = n*(n - 1) / 2;
for (int i = 1; i <= n; i++)
p[i] = i;
for (int i = 1; i <= m; i++)
cin >> road[i].x >> road[i].y >> road[i].money >> road[i].finish;
for (int i = 1; i <= m; i++)
if (road[i].finish == 1)
p[road[i].x] = p[road[i].y];
sort(road + 1, road + 1 + m, Judge);
for (int i = 1; i <= m; i++)
merge(road[i].x, road[i].y, i);
cout << sum << endl;
}
return 0;
}