(hdu step 6.1.4)还是畅通工程(求让n个点联通的最小费用)
2015-03-10 12:36
323 查看
题目:
题目分析:
使用kruscal来求最小生成树,简单题。
代码如下:
/*
* d.cpp
*
* Created on: 2015年3月10日
* Author: Administrator
*/
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 101;
struct Edge{
int begin;
int end;
int weight;
}edges[maxn*maxn];//注意这里的边数应该是maxn*maxn而不是maxn。因为n个点之间应该有n*(n-1)/2条边
int father[maxn];
int find(int a){
if(a == father[a]){
return a;
}
return father[a] = find(father[a]);
}
int kruscal(int count){
int i;
for(i = 1 ; i < maxn ; ++i){
father[i] = i;
}
int sum = 0;
for(i = 1 ; i <= count ; ++i){
int fa = find(edges[i].begin);
int fb = find(edges[i].end);
if(fa != fb){
father[fa] = fb;
sum += edges[i].weight;
}
}
return sum;
}
bool cmp(Edge a,Edge b){
return a.weight < b.weight;
}
int main(){
int n;
while(scanf("%d",&n)!=EOF,n){
int m = (n-1)*n/2;
int cnt = 1;
int i;
for(i = 1 ; i <= m ; ++i){
scanf("%d%d%d",&edges[cnt].begin,&edges[cnt].end,&edges[cnt].weight);
cnt++;
}
cnt -= 1;
sort(edges+1,edges+1+cnt,cmp);
printf("%d\n",kruscal(cnt));
}
return 0;
}
还是畅通工程 |
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) |
Total Submission(s): 165 Accepted Submission(s): 127 |
[align=left]Problem Description[/align]某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。 |
[align=left]Input[/align]测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( < 100 );随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到N编号。 当N为0时,输入结束,该用例不被处理。 |
[align=left]Output[/align] 对每个测试用例,在1行里输出最小的公路总长度。 |
[align=left]Sample Input[/align]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 |
[align=left]Sample Output[/align]3 5HintHint Huge input, scanf is recommended. |
[align=left]Source[/align]浙大计算机研究生复试上机考试-2006年 |
[align=left]Recommend[/align]JGShining |
使用kruscal来求最小生成树,简单题。
代码如下:
/*
* d.cpp
*
* Created on: 2015年3月10日
* Author: Administrator
*/
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 101;
struct Edge{
int begin;
int end;
int weight;
}edges[maxn*maxn];//注意这里的边数应该是maxn*maxn而不是maxn。因为n个点之间应该有n*(n-1)/2条边
int father[maxn];
int find(int a){
if(a == father[a]){
return a;
}
return father[a] = find(father[a]);
}
int kruscal(int count){
int i;
for(i = 1 ; i < maxn ; ++i){
father[i] = i;
}
int sum = 0;
for(i = 1 ; i <= count ; ++i){
int fa = find(edges[i].begin);
int fb = find(edges[i].end);
if(fa != fb){
father[fa] = fb;
sum += edges[i].weight;
}
}
return sum;
}
bool cmp(Edge a,Edge b){
return a.weight < b.weight;
}
int main(){
int n;
while(scanf("%d",&n)!=EOF,n){
int m = (n-1)*n/2;
int cnt = 1;
int i;
for(i = 1 ; i <= m ; ++i){
scanf("%d%d%d",&edges[cnt].begin,&edges[cnt].end,&edges[cnt].weight);
cnt++;
}
cnt -= 1;
sort(edges+1,edges+1+cnt,cmp);
printf("%d\n",kruscal(cnt));
}
return 0;
}
相关文章推荐
- hdu 1233 还是畅通工程(最小生成树)
- hdu 1233 还是畅通工程(最小生成树)
- HDU 1233 还是畅通工程(最小生成树)
- HDU 1233 还是畅通工程(最小生成树,prim)
- (hdu step 6.1.7)Connect the Cities(在有的路已经修建好的情况下,求让n个点连通的最小费用)
- hdu1233 还是畅通工程(最小生成树 prim 算法)
- HDU 1233 还是畅通工程 最小生成树入门
- (hdu step 6.1.2)Eddy's picture(在只给出二维坐标点的情况下,求让n个点连通的最小费用)
- HDU 1233-还是畅通工程(最小生成树)
- poj1258 Agri-Net +hdu 1233 还是畅通工程 (最小生成树Prime算法)
- (step6.1.4)hdu 1102(Constructing Roads——最小生成树)
- HDU 1233 还是畅通工程(最小生成树)
- (step6.1.5)hdu 1233(还是畅通工程——最小生成树)
- (hdu step 6.1.5)继续畅通工程(求让n个点连通的最小费用)
- [ACM] hdu 1233 还是畅通工程(最小生成树)
- (step6.1.4)hdu 1102(Constructing Roads——最小生成树)
- hdu 1233 还是畅通工程(最小生成树,基础)
- (step6.1.5)hdu 1233(还是畅通工程——最小生成树)
- hdu 1233 还是畅通工程(最小生成树)
- (hdu step 6.1.6)Jungle Roads(在索引为字符索引的情况下,求让n个点连通的最小费用)