生成树的问题,主要是思路转化不够,看了别人的思想把这题A了,还是得多思考,加速思想的转化。
#include<cstdio>
#include<algorithm>
#define maxn 100000+10
using 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;
}