您的位置:首页 > 其它

HDU 1863 畅通工程 最下生成树问题

2013-07-30 20:08 295 查看
题目描述:给出图,要你求是否存在最小生成树,如果存在,要求输出最小权值和,如果不存在,输出?

解题报告:又是一个最裸的克鲁斯卡尔,并且要判断是否存在最小生成树的问题。废话不多说,给个短代码:

#include<cstdio>
#include<algorithm>
const int MAX = 100+5;
int N,M,prim[MAX];
int find(int k) {
return prim[k]==k? k:prim[k] = find(prim[k]);
}
struct node {
int x,y,length;
}rode[MAX];
int cmp(node a,node b) {
return a.length<b.length;
}
int main() {
while(scanf("%d%d",&N,&M),N) {
for(int i = 0;i<N;++i)
scanf("%d%d%d",&rode[i].x,&rode[i].y,&rode[i].length);
std::sort(rode,rode+N,cmp);
for(int i = 1;i<=M;++i)
prim[i] = i;
int sum = 0;
for(int i = 0;i<N;++i)
if(find(rode[i].x) != find(rode[i].y)) {
prim[find(rode[i].x)] = find(rode[i].y);
sum+=rode[i].length;
}
bool flag = 0;
for(int i = 2;i<=M;++i)
if(find(i) != find(1)) {
flag = 1;
break;
}
if(flag) {
printf("?\n");
continue;
}
printf("%d\n",sum);
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: