此题意思大概就是使得给出化合物来装运,但得保证n个化合物中刚好有n种元素,那么我们以每个元素为一个结点,装上车化合物即会连边成图,这样以来就能想到为避免爆炸就不应该出现环的情况,因为在无环图中,n个点也就只有n-1条边,每条边代表一个化合物,那么有环的时候就刚好是n个点n个化合物了,这便是把实际问题抽象出图论模型,这样以来问题就变成检验是否有环和无环的问题了。
对于检验是否存在环,笨一点的办法就是进行dfs或者bfs每次装载前检测是否存在环,但这样并不高效,因为我们并不关心图的具体情况怎样的,我们只想知道两个节点间是否存在一个环,并查集就刚好能达到这个效果,如果插入的化合物两个元素已然在同一个集合中,那么便存在环,这样以来问题就简便多了。
#include<stdio.h>
#include<stdlib.h>
#define maxn 100000+5
int p[maxn];
int find(int x){
return (p[x] != x ) ? p[x] = find(p[x]):x; //找到每个点的父亲并进行状态压缩
}
int main(){
int a,b,sum;
while(scanf("%d",&a)==1){
for(int i=0;i<maxn;i++)p[i]=i;//并查集的首要初始化,每个节点的父亲开始都是他自己
sum=0;//统计拒绝物品数
while(a!=-1){
scanf("%d",&b);
a=find(a),b=find(b);
if(a!=b)//父亲不一样
p[a]=b;//归并成一个集合
else sum++;
scanf("%d",&a);
}
printf("%d\n",sum);
}
return 0;
}