UVALive - 3644 X-Plosives(并查集判断是否有环)

易爆物( X-Plosives, LA 3644
有一些简单化合物, 每个化合物都由两种元素组成的( 每个元素用
一个大写字母表示) 。 你是一个装箱工人, 从实验员那里按照顺序依次
把一些简单化合物装到车上。 但这里存在一个安全隐患: 如果车上存在
k
个简单化合物, 正好包含k种元素, 那么它们将组成一个易爆的混合物。
为了安全起见, 每当你拿到一个化合物时, 如果它和已装车的化合物形
成易爆混合物, 你就应当拒绝装车; 否则就应该装车。 编程输出有多少
288
个没有装车的化合物。
【 输入格式】
输入包含多组数据。 每组数据包含若干行, 每行为两个不同的整数
ab0≤ab≤105) , 代表一个由元素a和元素b组成的简单化合物。 所有
简单化合物按照交给你的先后顺序排列。 每组数据用一行
-1结尾。 输入结
束标志为文件结束符(
EOF) 。
【 输出格式】
对于每组数据, 输出没有装车的化合物的个数。
【 分析】
我们把每个元素看成顶点, 则一个简单化合物就是一条边。 当整个
图存在环的时候, 组成环的边对应的化合物是危险的, 反之则是安全
的。
这样, 我们可以用一个并查集来维护图的连通分量集合, 每次得到
一个简单化合物(
x y) 时检查xy是否在同一个集合中。 如果是, 则拒

绝, 反之则接受。

//尼玛,k个化合物的元素正好是k个元素,这正好是个环,于是判断可不可以构成环即可
#include
#include
using namespace std;
const int mn=1e+5+5;
int f[mn];
int find(int x){
	int t=x;
	while(x!=f[x]) x=f[x];
	return f[t]=x;
}
int main(){
	int x,y;
	while(~scanf("%d",&x)&&x!=-1){
		int ans=0;
		if(x!=-1)
		for(int i=0;i


你可能感兴趣的:(graph,theory,template)