HDU 3371 最小生成树 kruskal

来源:互联网 发布:mac自带截图快捷键 编辑:程序博客网 时间:2024/06/05 02:57

赤裸裸的最小生成树,,直接上kruskal,最后判断一下能不能全都连起来,并查集这几天真是写到吐了。。。

还有啊,,一样的代码用g++交就tle了,c++就过了,简直了,,,,

#include<stdio.h>#include<iostream>#include<algorithm>#include<string.h>using namespace std;int father[510];int find(int x){    if(x==father[x]) return x;    father[x]=find(father[x]);    return father[x];}struct s{    int u,v,w;};s a[25510];bool cmp(s x,s y){    return x.w<y.w;}int main(){    int i,j,n,m,k,t,T,ans,x,y,fu,fv,fx,fy;    scanf("%d",&T);    while(T--)    {        scanf("%d%d%d",&n,&m,&k);        for(i=0;i<510;i++) father[i]=i;        for(i=1;i<=m;i++)        {            scanf("%d%d%d",&a[i].u,&a[i].v,&a[i].w);        }        while(k--)        {            scanf("%d",&t);            scanf("%d",&x);            t--;            while(t--)            {                scanf("%d",&y);                fy=find(y);                fx=find(x);                if(fy!=fx)                father[fy]=fx;            }        }        int temp=0;        for(i=1;i<=n;i++)            if(i==father[i])            temp++;        ans=0;        sort(a+1,a+m+1,cmp);        if(temp!=1)        for(i=1;i<=m;i++)        {            fu=find(a[i].u);            fv=find(a[i].v);            if(fu!=fv)            {                ans+=a[i].w;                father[fu]=fv;                temp--;                if(temp==1) break;            }        }        if(temp==1)        printf("%d\n",ans);        else printf("-1\n");    }    return 0;}


0 0
原创粉丝点击