uva 1160

来源:互联网 发布:马基雅维利主义知乎 编辑:程序博客网 时间:2024/04/29 00:21

此题意思大概就是使得给出化合物来装运,但得保证n个化合物中刚好有n种元素,那么我们以每个元素为一个结点,装上车化合物即会连边成图,这样以来就能想到为避免爆炸就不应该出现环的情况,因为在无环图中,n个点也就只有n-1条边,每条边代表一个化合物,那么有环的时候就刚好是n个点n个化合物了,这便是把实际问题抽象出图论模型,这样以来问题就变成检验是否有环和无环的问题了。

对于检验是否存在环,笨一点的办法就是进行dfs或者bfs每次装载前检测是否存在环,但这样并不高效,因为我们并不关心图的具体情况怎样的,我们只想知道两个节点间是否存在一个环,并查集就刚好能达到这个效果,如果插入的化合物两个元素已然在同一个集合中,那么便存在环,这样以来问题就简便多了。

#include<stdio.h>#include<stdlib.h>#define maxn 100000+5int 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;}


原创粉丝点击