• 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;
    }
    
  • 相关阅读:
    微信成为开发者C#代码
    Ajax.ActionLink()方法的使用
    Entity FrameWork初始化数据库的四种策略
    最长公共子序列
    表达式求值
    韩信点兵
    蛇形填数
    5个数求最值
    求转置矩阵问题
    素数求和问题
  • 原文地址:https://www.cnblogs.com/Hayasaka/p/14294255.html
Copyright © 2020-2023  润新知