就是求是否存在有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;
}