易爆物
【问题描述】
有一些简单化合物,每个化合物由2种不同元素组成(每一个元素用一个正整数表示)。假设你是一个搬运工,你按照顺序依次将一些化合物放进车里,但是如果车上存在k个简单化合物且正好包含K种元素的话,那么他们将变成易爆的混合物。为安全起见,每当你拿到一个化合物的时候,如果它和已装车的化合物形成易爆混合物,你就应当拒绝装车,否则就应该装车。
请输出有多少个化合物没有装车。
【文件输入】
输入文件plosives.in。
输入包含若干行(最多可能10^5行),每行为两个不同的整数a,b,(0<=a,b<=10^5)代表一个由元素a和b组成的简单化合物,所有简单化合物按照交给你的先后顺序排列。
【文件输出】
输出文件plosives.out。
输出没有装出的化合物的个数。
【输入样例】
1 2
1 3
2 4
2 5
3 5
2 3
3 6
【输出样例】
2
易爆物LA3644 X-Plosives 并查集(维护连通分量,判断有无环)
白书P191
一个元素当做一个节点,一个物品由两个节点之间的一条边(因为一个物品由2个元素组成),让元素相连产生一个环的时候会产生危险
现在给我们很多个物品,要我们输出剔除多少个物品,能够保证安全
做法:用并查集维护一个图的连通分量几个,每次得到化合物(x,y)时,检查x和y是否在一个集合中,如果是则需要拒绝当前化合物,(因为x,y在一个连通分量中,此时图尚不存在环,可以说是一棵树,但当边x-y加入到该连通分量的时候显然就产生了一个环)。
路径压缩优化、按秩顺序合并,请查资料。