HDU 1863 畅通工程

//第一次做最小生成树的题目,感觉这题用克鲁斯卡尔算法还行//

AC代码:

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std; struct node { int w,v,c; } t[20000]; int cmp(node p,node q) { return p.c<q.c; } int n,m; int p[20000]; int find(int k) { if(p[k]!=k) { return find(p[k]); } else { return p[k]; } } int cl() { int sum=0,cnt=0,i; for(i=0; i<n; i++) { int x=find(t[i].w); int y=find(t[i].v); if(x!=y) {
            p[y]=x;
            sum+=t[i].c;
            cnt++; } if(cnt==m-1) return sum; } return -1; } int main() { while(scanf("%d%d",&n,&m)!=EOF&&n!=0) { int i; for(i=1; i<=m; i++) {
            p[i]=i; } for(i=0; i<n; i++) {
            scanf("%d%d%d",&t[i].w,&t[i].v,&t[i].c); }
        sort(t,t+n,cmp); int t=cl(); if(t!=-1) {
            printf("%d\n",t); } else {
            printf("?\n"); } } return 0; }

你可能感兴趣的:(HDU 1863 畅通工程)