本题链接:点击打开链接
本题题意:
有n条路m个村庄,输入每条路连接哪两个村庄,及修该段路的费用,求使所有村庄均可畅通(并非两两均连通)
的最少费用。
解题思路:
此题与hdu 1233 还是畅通工程 相类似,均是使用kruskal算法思想。
具体请参考代码:
#include<stdio.h> #include<algorithm> using namespace std; int per[110]; int n,m; struct node{ int u,v,w; }a[110]; int cmp(node a,node b) { return a.w<b.w; } void init() { for(int i=1;i<=m;i++) per[i]=i; } int find(int x) { if(x==per[x]) return x; return per[x]=find(per[x]); } bool join(int x,int y) { int fx=find(x); int fy=find(y); if(fx!=fy) { per[fx]=fy; return true; } else return false; } int main() { while(scanf("%d%d",&n,&m),n) { for(int i=0;i<n;i++) scanf("%d%d%d",&a[i].u,&a[i].v,&a[i].w); init(); if(n<m-1) { printf("?\n"); continue; } sort(a,a+n,cmp); int sum=0; for(int i=0;i<n;i++) { if(join(a[i].u,a[i].v)) { sum+=a[i].w; } } int cnt=0; for(int i=1;i<=m;i++) if(i==per[i]) cnt++; if(cnt==1) printf("%d\n",sum); else printf("?\n"); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-11 21:29:58