hdu 4263 Red/Blue Spanning Tree

给出一个图,如果要得到用k条蓝边组成的生成树,那么这个k值一定在用最少蓝边组成的生成树和最多蓝边组成的生成树之间,最少蓝边组成的生成树所用的蓝边数即为以红边为基准建造生成树,如果两棵树不在同一棵树上,那么就需要蓝边来连接,这样的话就可以求得所用的最小蓝边数,同样再以蓝边为基准,建造生成树,不断添加红边,就可以求得所需蓝边的最大数目,只要k在这个范围之内就输出1.采用并查集判定并连接两个子树

#include <cstdio>
int n,m,k;
int p[1010],q[1010];
int find_b(int x)
{
    return p[x]==x?x:p[x]=find_b(p[x]);
}
int find_r(int x)
{
    return q[x]==x?x:q[x]=find_r(q[x]);
}
int main()
{
    //freopen("in.txt","r",stdin);
    while(scanf("%d %d %d",&n,&m,&k)!=EOF)
    {
        if(n+m+k==0) break;
        char ch[2];
        int u,v;
        int cnt_b=n-1,cnt_r=n-1,r=0,b=0;
        for(int i=0;i<=n;++i) q[i]=p[i]=i;
        for(int i=0;i<m;++i)
        {
            scanf("%s %d %d",ch,&u,&v);
            if(ch[0]=='B')
            {
                ++b;
                int x=find_b(u),y=find_b(v);
                if(x!=y) --cnt_r,p[x]=y;
            }
            else
            {
                ++r;
                int x=find_r(u),y=find_r(v);
                if(x!=y) --cnt_b,q[x]=y;
            }
        }
        if(k>=cnt_b&&k<=b&&n-k-1<=r&&n-k-1>=cnt_r) printf("1\n");
        else printf("0\n");
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值