UVALive(LA) 3644 X-Plosives (并查集)
2015-11-08 10:35
344 查看
题意:
有一些简单化合物,每个化合物都由两种元素组成的,你是一个装箱工人、从实验员那里按照顺序把一些简单化合物装到车上,但这里存在安全隐患:如果车上存在K个简单化合物,正好包含K种元素,那么他们就会组成一个容易爆炸的混合物,为了安全起见,每当你拿到一个化合物时,如果它已经和已装车的化合物形成了易爆混合物,你就应该拒绝装车,否则就应该装车,输出你拒绝了多少个混合物。
思路:
一种化合物由两种元素组成,所以我们就可以把每个元素看成一个点,那么一个简单化合物就是一条边。当图出现环的时侯,组成环的边对应的化合物就是比较危险的,否则就是安全的。。所以我们可以用并查集来把每次进来的化合物的两个元素看成点,加入集合之中,每次得到一个化合物判断是否使整个图形成了环,如果是 就拒绝,否则就接受。
有一些简单化合物,每个化合物都由两种元素组成的,你是一个装箱工人、从实验员那里按照顺序把一些简单化合物装到车上,但这里存在安全隐患:如果车上存在K个简单化合物,正好包含K种元素,那么他们就会组成一个容易爆炸的混合物,为了安全起见,每当你拿到一个化合物时,如果它已经和已装车的化合物形成了易爆混合物,你就应该拒绝装车,否则就应该装车,输出你拒绝了多少个混合物。
思路:
一种化合物由两种元素组成,所以我们就可以把每个元素看成一个点,那么一个简单化合物就是一条边。当图出现环的时侯,组成环的边对应的化合物就是比较危险的,否则就是安全的。。所以我们可以用并查集来把每次进来的化合物的两个元素看成点,加入集合之中,每次得到一个化合物判断是否使整个图形成了环,如果是 就拒绝,否则就接受。
#include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #include <cctype> #include <algorithm> using namespace std; const int MAXN = 1e5 + 3; int pre[MAXN]; int Find(int x) { int r = x; while(pre[r] != r) { r = pre[r]; } int i = x,j; while(pre[i] != r) { j = i; i = pre[i]; pre[j] = r; } return r; } void Mix(int a,int b) { int x = Find(a); int y = Find(b); if(x > y) { pre[x] = y; } if(x < y) { pre[y] = x; } } void Mst() { for(int i = 1; i <= MAXN; i++) { pre[i] = i; } } int main() { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); int m,n; int ans = 0; Mst(); while(~scanf("%d",&n)) { if(n == -1) { cout << ans <<endl; ans = 0; Mst(); continue; } scanf("%d",&m); int fx = Find(n); int fy = Find(m); if(fx == fy) ans++; //形成了环 else Mix(n,m); } return 0; }
相关文章推荐
- 野人学Android第二弹——自定义ListView第一课
- 在ListView中使用多样的布局
- HDFS用户权限管理
- CodeForcesGym 100733G No Negations
- linux命令-分区表fstab
- xcode 快捷键修改
- Python入门篇之函数
- HDU 1465 不容易系列之一(错排公式)
- 解决运行PHP一片空白
- 简单画板的制作
- CV创业前景一点看法
- 关于洗牌算法的一点总结
- 写给Linux内核新手-关于Linux内核学习的误区
- LeetCode First Bad Version 二分法
- poj1017 水
- Struts2表单提交的中文字符数据用hibernate存储在数据库中是乱码的问题。
- hadoop+hbase+hive+pig的部署实践
- 多线程
- 不相交集ADT(联机算法 + 脱机算法)
- PHP常用语法