专题四1005

来源:互联网 发布:电影同声传译软件 编辑:程序博客网 时间:2024/06/03 00:25

题目大意:

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

输入:

有多个测试实例,每个实例的第一行输入一个正整数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;

}

0 0
原创粉丝点击