畅通工程,最小生成树(九度 OJ 1017)
2018-03-01 20:22
281 查看
题目描述:
某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。
输入:
输出:
样例输入:
样例输出:
这是很典型的最小生成树的例子,按照克鲁斯卡尔算法来进行求解,首先排序,然后对边从小到大进行遍历,如果属于两个不同的并查集,则加入一个并查集中,成本增加
某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。
输入:
测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( < 100 );随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到N编号。 当N为0时,输入结束,该用例不被处理。
输出:
对每个测试用例,在1行里输出最小的公路总长度。
样例输入:
3 1 2 1 1 3 2 2 3 4 4 1 2 1 1 3 4 1 4 1 2 3 3 2 4 2 3 4 5 0
样例输出:
3 5
这是很典型的最小生成树的例子,按照克鲁斯卡尔算法来进行求解,首先排序,然后对边从小到大进行遍历,如果属于两个不同的并查集,则加入一个并查集中,成本增加
#include <stdio.h> int tree[100]; int find_root(int x){ if(tree[x] == -1) return x; else{ int temp = find_root(tree[x]); tree[x] = temp; return temp; } } struct Edge{ int a; int b; int cost; }Edge[2000]; void swap(int * a,int * b){ int temp; temp = * a; * a = * b; * b = temp; } void EdgeSwap(struct Edge * edge1,struct Edge * edge2){ swap(& edge1->a, & edge2->a); swap(& edge1->b, & edge2->b); swap(& edge1->cost, & edge2->cost); } int main(int argc, const char * argv[]) { int n; while(scanf("%d",&n) != EOF && n != 0){ int lenth = 0; int m = n * (n - 1) / 2; for(int i = 0;i < m;i ++){ scanf("%d%d%d",&Edge[i].a,&Edge[i].b,&Edge[i].cost); } for(int i = 0;i < m;i ++){ for(int j = m - 1;j > i;j --){ if(Edge[j].cost < Edge[i].cost) EdgeSwap(& Edge[i], & Edge[j]); } } // for(int i = 0;i < m;i ++){ // printf("%d %d %d\n",Edge[i].a,Edge[i].b,Edge[i].cost); // } for(int i = 1;i <= n;i ++) tree[i] = -1; for(int i = 0;i < m;i ++){ int root_a = find_root(Edge[i].a); int root_b = find_root(Edge[i].b); if(root_a != root_b){ tree[Edge[i].b] = find_root(Edge[i].a); lenth = lenth + Edge[i].cost; } } printf("%d\n",lenth); } return 0; }
相关文章推荐
- 九度OJ 题目1017:还是畅通工程 (最小生成树)
- 九度OJ 1017:还是畅通工程 (最小生成树)
- 九度OJ 1017:还是畅通工程 (最小生成树)
- 九度OJ 1017:还是畅通工程 (最小生成树)
- 九度OJ 1012:畅通工程 (最小生成树)
- 九度题目1017:还是畅通工程 最小生成树算法(并查集算法变种)
- 九度OJ 1012:畅通工程 (最小生成树)
- 九度OJ 1028:继续畅通工程 (最小生成树)
- 【杭电oj】1879 - 继续畅通工程(最小生成树)
- HDU 1233 还是畅通工程 (九度OJ 1017)
- 【九度OJ】题目1017:还是畅通工程 解题报告
- 九度OJ-1017:还是畅通工程
- 【九度OJ】1017【BST】【畅通工程系列2006】
- 【杭电oj】1863 - 畅通工程(最小生成树,模版)
- hdu 1233&&九度oj 1017还是畅通工程
- 九度 OJ 题目1017:还是畅通工程
- 九度oj 题目1017:还是畅通工程 【ZJU2006考研机试题3】
- 九度OJ题目1017:还是畅通工程
- 九度OJ 1347:孤岛连通工程 (最小生成树)
- 【杭电oj】1102 - Constructing Roads(畅通工程,最小生成树)