HDU 3371 Connect the Cities

来源:互联网 发布:淘宝网舞蹈水袖 编辑:程序博客网 时间:2024/04/28 02:29
最短路水题,Kus算法秒过
#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;const int maxm=25000+10;int n,m,k,p[maxm],w;int sum;struct node{    int u,v,c;} t[maxm],tt[maxm];int cmp(node p,node q){    return p.c<q.c;}int find(int k){    if(p[k]!=k)    {        return p[k]=find(p[k]);    }    else    {        return p[k];    }}void kus(){    int i;    for(i=0; i<w; i++)    {        int x1=find(tt[i].u);        int y1=find(tt[i].v);        if(x1!=y1)        {            p[y1]=x1;            sum+=tt[i].c;        }    }}int main(){    int y;    scanf("%d",&y);    while(y--)    {        int i,j;        scanf("%d%d%d",&n,&m,&k);        for(i=1; i<=n; i++)        {            p[i]=i;        }        int u,v,c;        for(i=0; i<m; i++)        {            scanf("%d%d%d",&u,&v,&c);            t[i].u=u;            t[i].v=v;            t[i].c=c;        }        int temp1,temp2,temp3;        w=0;        int ans=0;        for(i=0;i<k;i++)        {            scanf("%d",&temp1);            scanf("%d",&temp2);            int x1=find(temp2);            for(j=1;j<temp1;j++)            {                scanf("%d",&temp3);                int y1=find(temp3);                if(x1!=y1)                {                    p[y1]=x1;                }            }        }        for(i=0;i<m;i++)        {            int f1=find(t[i].u);            int f2=find(t[i].v);            if(f1!=f2)            {                tt[w].u=t[i].u;                tt[w].v=t[i].v;                tt[w].c=t[i].c;                w++;            }        }        sort(tt,tt+w,cmp);        sum=0;        kus();        int ok=0;        for(i=1;i<=n;i++)        {            if(p[i]==i)            {                ok++;            }        }        if(ok==1)        {            printf("%d\n",sum);        }        else        {            printf("-1\n");        }    }    return 0;}

0 0