UVALive 3644

在这里插入图片描述
在这里插入图片描述
题目大意:
给出一些化合物,每组化合物由两个元素组成,在N>2的情况下,如果有n组化合物正好对应n种物质,如:A - B B - C C - A 这样就会产生爆炸,就不饿能要了,对于每组化合物,如果会产生爆炸则不能要,否则必须要。

解题思路:
经典带环并查集。看了一晚上硬是没看出来,题解把每一组化合物看成一个边,把每一个元素看成点,进来一组就连一组,如果成环的话则ans++,最后输出ans即可。AC代码:
PS:多组输入是个坑,注意一下

#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int _max = 1e5+50;
int f[_max],ans=0,a,b;
int find(int x)//寻根+路径压缩
{
	return f[x]==x?x:f[x]=find(f[x]);
}
void merge(int x,int y)//判断是否合并
{
	int t1=find(x);
	int t2=find(y);
	t1==t2?ans++:f[t2]=t1;
}
void init()
{
	ans=0;
	for(int i=0;i<_max;i++)
	  f[i]=i;
}
int main()
{
	for(int i=0;i<_max;i++)
	  f[i]=i;
	while(cin>>a)
	{
		if(a==-1)
		{
			cout<<ans<<endl;
			init();
			continue;
		}
		cin>>b;
		merge(a,b);
	}
	//system("pause");
	return 0;
}
原文地址:https://www.cnblogs.com/Hayasaka/p/14294255.html