uva 1160

本文通过一个具体的运输化合物问题,介绍了如何将实际问题抽象为图论模型,并使用并查集数据结构来判断图中是否存在环。通过并查集可以有效地避免形成环状结构,确保了运输过程的安全。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

此题意思大概就是使得给出化合物来装运,但得保证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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值