专题四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;
}
- 专题四1005
- 专题四1005
- 1005-E专题四
- 专题四 · 1005
- 杭电acm专题四1005
- 3G专题四
- LDAP专题(四)
- 专题四1003
- 专题四1003
- 专题四 · 1001
- 专题四 Problem A
- 专题四 Problem B
- 专题四 Problem C
- 专题四 Problem D
- 专题四 Problem E
- 专题四1001
- 专题四1004
- 专题四ACM1003
- CountDownLatchDemo
- Leetcode 62. Unique Paths
- C++补做实验一
- IOS中定时器NSTimer的开启与关闭
- hdu 1021 Fibonacci Again(斐波那契数列,取余)
- 专题四1005
- 数组中出现次数超过一半的数
- 补C++ 4
- 300 Longest Increasing Subsequence
- Fragment使用--文章集锦
- linux---谈谈vfork和fork的区别及exit与return
- 周末作业
- Android中获取布局中的布局(获取子布局方法)
- PYTHON-基础-时间日期处理小结