九度OJ - 1028 - 继续畅通工程
2016-06-23 08:27
253 查看
题目描述
省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。现得到城镇道路统计表,表中列出了任意两城镇间修建道路的费用,以及该道路是否已经修通的状态。现请你编写程序,计算出全省畅通需要的最低成本。输入
测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( 1< N < 100 );随后的 N(N-1)/2 行对应村庄间道路的成本及修建状态,每行给4个正整数,分别是两个村庄的编号(从1编号到N),此两村庄间道路的成本,以及修建状态:1表示已建,0表示未建。当N为0时输入结束。
输出
每个测试用例的输出占一行,输出全省畅通需要的最低成本。样例输入
31 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
样例输出
31
0
来源
2008年浙江大学计算机及软件工程研究生机试真题#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> using namespace std; int s[110]; struct Node{ int start, end, value; }nodes[110]; int cmp(Node node1, Node node2){ if(node1.value < node2.value) return 1; return 0; } int find(int n){ while(s != n) n = s ; return n; } void un(int a, int b){ a = find(a); b = find(b); if(a == b) return; else if(a > b) s[a] = b; else s[b] = a; } int main() { int n, m, f, v; while(scanf("%d", &n)!=EOF && n){ m = (n-1)*n/2; for(int i = 0; i < m; i++){ scanf("%d%d%d%d", &nodes[i].start, &nodes[i].end, &v, &f); if(!f) nodes[i].value = v; else nodes[i].value = 0; } sort(nodes, nodes+m, cmp); for(int i = 1; i < n+1; i++) s[i] = i; int ans = 0, cnt = 0; for(int i = 0; i < m; i++){ if(find(nodes[i].start) != find(nodes[i].end)){ un(nodes[i].start, nodes[i].end); ans += nodes[i].value; cnt++; if(cnt == n-1) break; } } printf("%d\n", ans); } }
相关文章推荐
- 利用Entity Framework修改指定字段中的值
- 广播注册的两种方式
- Scala类型声明与定义、函数定义、流程控制、异常处理
- 每天一个Linux命令(56)yum命令
- 昨天上午雨下的大,然后下午就没有下雨了
- Android DownloadManager 的使用
- Leetcode - Longest Substring Without Repeating Characters
- 自定义事件(2016.6.23)
- wxpython出错原因
- VirtualAlloc函数
- sphinx安装
- shiro kick out user
- GlobalAlloc函数
- 简单创建Android桌面小部件
- SystemParametersInfo函数
- JSTL标签库
- vim 编辑器的使用
- GetSystemInfo函数
- GetVersionEx函数
- 总结这一年多的时间