给出一个图,如果要得到用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;
}