HDU 还是畅通工程
来源:互联网 发布:从1688复制到淘宝店 编辑:程序博客网 时间:2024/06/05 08:53
Problem Description
某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。
Input
测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( < 100 );随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到N编号。
当N为0时,输入结束,该用例不被处理。
Output
对每个测试用例,在1行里输出最小的公路总长度。
Sample Input
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
Sample Output
3
某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。
Input
测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( < 100 );随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到N编号。
当N为0时,输入结束,该用例不被处理。
Output
对每个测试用例,在1行里输出最小的公路总长度。
Sample Input
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
Sample Output
3
5
#include<stdio.h>#include<string.h>#include<iostream>#include<algorithm>#include<math.h>#include<queue>#include<map>using namespace std;#define ll long longconst int Inf=1e+9;int n;int mp[101][101];bool vis[101];int dist[101];int Prim(int start){ int i,j; for (i=1;i<=n;i++) { dist[i]=mp[start][i]; vis[i]=false; } dist[start]=0; vis[start]=true; int sum=0; for (i=2;i<=n;i++) { int k; int Min=Inf; for (j=1;j<=n;j++) if(!vis[j]&&dist[j]<Min) { Min=dist[j]; k=j; } vis[k]=true; sum+=Min; for (j=1;j<=n;j++) if (!vis[j]&&dist[j]>mp[k][j]) dist[j]=mp[k][j]; } return sum;}int main(){ int i,m,a,b; while (~scanf("%d",&n),n) { for (i=1;i<=n*(n-1)/2;i++) { scanf("%d%d%d",&a,&b,&m); mp[a][b]=mp[b][a]=m; } for (i=1;i<=n;i++) mp[i][i]=Inf; printf("%d\n",Prim(1)); } return 0;}
下面是转载的一篇,用的是克鲁斯卡尔算法
http://blog.csdn.net/zcsylj/article/details/6561849
#include <iostream> #include <algorithm> using namespace std; typedef struct Road { int c1, c2, cost; }Road; bool myCompare(const Road &a, const Road &b) { if(a.cost < b.cost) return 1; return 0; } Road road[5051]; int city[101]; int Find(int n) { if(city[n] == -1) return n; return city[n] = Find(city[n]); } bool Merge(int s1, int s2) { int r1 = Find(s1); int r2 = Find(s2); if(r1 == r2) return 0; if(r1 < r2) city[r2] = r1; else city[r1] = r2; return 1; } int main() { //freopen("input.txt", "r", stdin); int n; while(scanf("%d", &n) && n) { int m = n*(n-1)/2; memset(city, -1, sizeof(city)); for(int i=0; i<m; ++i) scanf("%d %d %d", &road[i].c1, &road[i].c2, &road[i].cost); sort(road, road+m, myCompare); int sum = 0, count = 0; for(int i=0; i<m; ++i) { if(Merge(road[i].c1, road[i].c2)) { count ++; sum += road[i].cost; } if(count == n-1) break; } printf("%d/n", sum); } return 0; }
0 0
- hdu 还是畅通工程
- HDU 还是畅通工程
- hdu 还是畅通工程
- [hdu]还是畅通工程
- HDU 还是畅通工程
- hdu 还是畅通工程
- HDU:还是畅通工程
- HDU-还是畅通工程
- 还是畅通工程 HDU
- hdu 1233 还是畅通工程
- HDU 1233 还是畅通工程
- hdu 1233 还是畅通工程
- HDU 1233 还是畅通工程
- hdu 1233 还是畅通工程
- hdu 1233 还是畅通工程
- HDU 1233 还是畅通工程
- hdu 1233 还是畅通工程
- HDU 1233 还是畅通工程
- c++实现冒泡排序
- 对象序列化对于一个对象被多个对象共享的处理方法
- 第17课:Spark Streaming资源动态申请和动态控制消费速率原理剖析
- laravel5.2.3入门(一)
- Middle-题目83:49. Group Anagrams
- HDU 还是畅通工程
- C#在线预览文档(word,excel,pdf,txt,png)
- Java字符串截取
- 如何阅读java项目的源代码
- 欢迎使用CSDN-markdown编辑器
- Android5.0改变support中AlertDialog的样式
- Android自定义竖直SeekBar Android5.0可以用
- android:configChanges="screenSize | orientation | keyboardHidden"
- Android自动化测试之Robotium学习(一)