并查集判环(裸
A secret service developed a new kind of explosive that attain its volatile property only when a specific
association of products occurs. Each product is a mix of two different simple compounds, to which we
call a binding pair. If N > 2, then mixing N different binding pairs containing N simple compounds
creates a powerful explosive. For example, the binding pairs A+B, B+C, A+C (three pairs, three
compounds) result in an explosive, while A+B, B+C, A+D (three pairs, four compounds) does not.
You are not a secret agent but only a guy in a delivery agency with one dangerous problem: receive
binding pairs in sequential order and place them in a cargo ship. However, you must avoid placing in
the same room an explosive association. So, after placing a set of pairs, if you receive one pair that
might produce an explosion with some of the pairs already in stock, you must refuse it, otherwise, you
must accept it.
An example. Lets assume you receive the following sequence: A+B, G+B, D+F, A+E, E+G,
F+H. You would accept the first four pairs but then refuse E+G since it would be possible to make the
following explosive with the previous pairs: A+B, G+B, A+E, E+G (4 pairs with 4 simple compounds).
Finally, you would accept the last pair, F+H.
Compute the number of refusals given a sequence of binding pairs.
Input
The input will contain several test cases, each of them as described below. Consecutive
test cases are separated by a single blank line.
Instead of letters we will use integers to represent compounds. The input contains several lines.
Each line (except the last) consists of two integers (each integer lies between 0 and 105
) separated by
a single space, representing a binding pair.
Each test case ends in a line with the number ‘-1’. You may assume that no repeated binding pairs
appears in the input.
Output
For each test case, the output must follow the description below.
A single line with the number of refusals.
Sample Input
1 2
3 4
3 5
3 1
2 3
4 1
2 6
6 5
-1
Sample Output
3
题目大意:有一些化合物,每个化合物都由两种元素组成的(每个元素用一个大写字母表示)。你是一个装箱的工人,从实验员那里按照顺序依次把一些简单化合物装到车上。但这里存在一个安全隐患:如果车上存在k个简单的化合物,正好包含k中元素,那么它们将组成一个易爆的混合物。为了安全起见,每当你拿到一个化合物时,如果它和已装的化合物形成易爆混合物,你就应当拒绝装车;否则就应该装车。编程输出有多少个没有装车的化合物
将元素视为顶点,化合物视为边,则可将题目转化为添加一条边进去后是否生成环
故可用并查集判环
代码如下
#include<iostream>
#include<cstdio>
using namespace std;
const int maxn=1e5+10;
int f[maxn];
int find(int x)
{
if(x!=f[x])
{
f[x]=find(f[x]);
}
return f[x];
}
int main()
{
int x,y,i,xx,yy,ans=0;
while(~scanf("%d",&x))
{
ans=0;
for(i=0;i<=maxn;i++)
f[i]=i;
while(x!=-1)
{
scanf("%d",&y);
xx=find(x);
yy=find(y);
if(xx==yy)
{
ans++;
}
else
f[xx]=yy;
scanf("%d",&x);
}
printf("%d\n",ans);
}
return 0;
}
一开始没多组输入 临时加上就加了个while(1) 然后就疯狂超时了 学长说是玄学。。。。。。????