题意: 多个物品,每个物品由2种元素组成,按输入顺序装车,但当车上存在任意k个物品刚好包含k种元素则会爆炸,问有多少个物品是不能装车的?
1种元素表示1个点,一条线表示一个物品,即不能出现环(xy不能存在同一个集合)
#include<iostream>
#include<cstdio>
#include<set>
#include<string.h>
using namespace std;
#define N 100005
int father[N];
int find(int x)
{
while(father[x]!=x)
x=father[x];
return x;
}
void seth(int x,int y)
{
int px=find(x);
int py=find(y);
father[py]=px;
}
int main()
{
int i,j,a,b,res;
while(~scanf("%d%d",&a,&b))
{
res=0;
for(i=1;i<N;i++)
father[i]=i;
seth(a,b);
if(a==b) res++;
while(scanf("%d",&a)&&a!=-1)
{
scanf("%d",&b);
if(find(a)==find(b)) res++;
else seth(a,b);
}
printf("%d\n",res);
}
}