hdu4263 Kruscal

来源:互联网 发布:中信淘宝卡积分规则 编辑:程序博客网 时间:2024/04/30 14:33


就是求是否存在有k条蓝边的生成树。分别求蓝边尽量多和蓝边尽量少的情况,如果在这之间,就存在。否则,不存在。

比赛的时候想对了,关键是输入超时了,用的cin,主要是不能用%c。。。

#include <iostream>#include <cstdio>#include <algorithm>using namespace std;const int mm=25000;const int mn=2500000;struct Edge{    int a,b,d;    char c[5];}edge[mn];int n,m,k,num;char cc;int f[mn];bool cmp(Edge a,Edge b){    return a.d<b.d;}bool cmp1(Edge a,Edge b){    return a.d>b.d;}void Set(){    for(int i=1;i<=n;i++)        f[i]=i;}int find(int x){    if(x!=f[x])        f[x]=find(f[x]);    return f[x];}int main(){    int u,v,i,num1,num2,mst1,mst2,c,ret,x,y,kk;    while(scanf("%d%d%d",&n,&m,&k)!=EOF)    {        if(n==0&&m==0&&k==0)    break;        for(i=0;i<m;i++)        {            scanf("%s",edge[i].c);            scanf("%d%d",&edge[i].a,&edge[i].b);            if(edge[i].c[0]=='B')  edge[i].d=1;            if(edge[i].c[0]=='R')  edge[i].d=0;        }            sort(edge,edge+m,cmp);            Set();kk=0;c=0;             for(i=0;i<m&&c<n-1;i++)            {                x=find(edge[i].a);                y=find(edge[i].b);                if(x==y)    continue;                if(edge[i].c[0]=='B')                    f[x]=y,kk++;                else f[x]=y;                c++;            }            mst1=kk;            sort(edge,edge+m,cmp1);            Set();kk=0;c=0;            for(i=0;i<m&&c<n-1;i++)            {                x=find(edge[i].a);                y=find(edge[i].b);                if(x==y)    continue;                if(edge[i].c[0]=='B')                    f[x]=y,kk++;                else f[x]=y;                c++;            }            mst2=kk;            if(mst1<=k&&k<=mst2)                printf("1\n");            else                printf("0\n");    }    return 0;}


原创粉丝点击