hdu-1863-畅通工程

来源:互联网 发布:淘宝店怎么样 编辑:程序博客网 时间:2024/06/06 17:41

解题思路:

并查集看一下是否连通,连通并且找最短的路径。

程序:

#include<stdio.h>#include<stdlib.h>#include<string.h>int h[1000];struct In{    int a;    int b;    int cost;}s[1000];int cmp(const void *a,const void *b){    return (*(In*)a).cost - (*(In*)b).cost;}int find(int n){    return h[n]==n?n:h[n]=find(h[n]);}int main(){    int i,n,m,p,q,f;    while(scanf("%d",&n),n)    {        scanf("%d",&m);        for(i=1;i<=m;i++)        {            h[i]=i;        }        for(i=0;i<n;i++)        {            scanf("%d %d %d",&s[i].a,&s[i].b,&s[i].cost);        }        qsort(s,n,sizeof(s[0]),cmp);        int ans=0;        for(i=0;i<n;i++)        {            p=find(s[i].a);            q=find(s[i].b);            if(p!=q)            {                ans+=s[i].cost;                h[p]=q;            }        }        f=0;        for(i=1;i<=m;i++)        {            if(find(i)==i)            f++;        }        if(f>1)        printf("?\n");        else        printf("%d\n",ans);    }    return 0;} 

0 0
原创粉丝点击