[kuangbin带你飞]专题八 生成树 D

来源:互联网 发布:centos 自动获取ip 编辑:程序博客网 时间:2024/05/17 23:45

题目地址:https://vjudge.net/contest/67265#problem/D

#include<cstdio>#include<cstring>#include<cstdlib>#include<cmath>#include<iostream>#include<algorithm>using namespace std;struct node{    int x,y,s;}s[2000];int cmp(node a,node b){    return a.s<b.s;}int f[120];void inti(){    for(int i=0;i<=100;i++)        f[i]=i;}int find(int x){    if(x!=f[x])        return f[x]=find(f[x]);    return x;}int main(){    int T;    cin>>T;    int c[2000];    for(int cas=1;cas<=T;cas++)    {        inti();        int flag=1;        int n,m;        cin>>n>>m;        for(int i=0;i<m;i++)        {            scanf("%d %d %d",&s[i].x,&s[i].y,&s[i].s);        }        sort(s,s+m,cmp);        int ans=0,t=0;        for(int i=0;i<m;i++)        {            int x=find(s[i].x);            int y=find(s[i].y);            if(x!=y)            {                f[x]=y;                c[t]=i;                t++;                ans+=s[i].s;            }            if(t==n-1)                break;        }        if(t!=n-1)        {            printf("Case #%d : No way\n",cas);            continue;        }        int ansx=0x7fffffff;        for(int i=0;i<t;i++)        {            inti();            int tt=0,an=0;            for(int j=0;j<m;j++)            {                if(j==c[i])                    continue;                int x=find(s[j].x);                int y=find(s[j].y);                if(x!=y)                {                    f[x]=y;                    an+=s[j].s;                    tt++;                }                if(tt==n-1)                    break;            }            if(tt==n-1)            {                ansx=min(ansx,an);            }        }        if(ansx==0x7fffffff)            printf("Case #%d : No second way\n",cas);        else            printf("Case #%d : %d\n",cas,ansx);    }    return 0;}
0 0
原创粉丝点击