hdu4263

来源:互联网 发布:菲律宾禁毒知乎 编辑:程序博客网 时间:2024/05/18 00:18

生成树的问题,主要是思路转化不够,看了别人的思想把这题A了,还是得多思考,加速思想的转化。

#include<cstdio>#include<algorithm>#define maxn 100000+10using namespace std;int n,m,k;int rank_r[maxn],rank_b[maxn],par_r[maxn],par_b[maxn];void init(){    for(int i=0; i<=n; i++)    {        par_r[i]=par_b[i]=i;        rank_r[i]=rank_b[i]=0;    }}int find(int x,int color){    if(color==1)    {        if(x==par_r[x])            return x;        return par_r[x]=find(par_r[x],1);    }    if(color==2)    {        if(x==par_b[x])            return x;        return par_b[x]=find(par_b[x],2);    }}void union_set(int x,int y,int color,int par[],int ran[],int &cnt){    x=find(x,color);    y=find(y,color);    if(x==y)return;    if(ran[x]<ran[y])    {        cnt++;        par[x]=y;    }    else    {        cnt++;        par[y]=x;        if(ran[x]==ran[y])ran[x]++;    }}int main(){    while(scanf("%d%d%d",&n,&m,&k),n||m||k)    {        int cnt_r,cnt_b;        init();        cnt_r=cnt_b=0;        for(int i=0; i<m; i++)        {            char ch = 0;            while(ch!='B'&&ch!='R')                ch=getchar();            int a,b;            scanf("%d%d",&a,&b);//            printf("%d %c\n",i,ch);            if(ch=='R')            {                union_set(a,b,1,par_r,rank_r,cnt_r);            }            else            {                union_set(a,b,2,par_b,rank_b,cnt_b);            }        }//        printf("cntr = %d cnt_b = %d\n",cnt_r,cnt_b);        if(k>=(n-1-cnt_r)&&k<=cnt_b)            printf("1\n");        else            printf("0\n");    }    return 0;}


0 0