poj2492——A Bug's Life

并查集与食物链问题
本文介绍了一种使用并查集解决复杂食物链问题的方法。通过实现并查集的基本操作,如查找与合并,来判断食物链中是否存在矛盾的情况。代码详细展示了如何通过调整并查集中的权值来维护食物链的正确性。

并查集高级应用。食物链的思想。

#include<iostream> #include<cstdio> #include<string> using namespace std; int p[2005],r[2005]; int n,m; int find(int a) { if(p[a]==a) return a; int m=find(p[a]); r[a]=(r[p[a]]+r[a])%2; p[a]=m; return m; } void unin(int a,int b,int f1,int f2) { p[f2]=f1; r[f2]=(r[a]+1+r[b])%2;//这里不能写成r[f2]=(r[f1]+1)%2 因为r[f1]不一定是更新之后的 // 而是要根据r[a]、r[b]来确定r[f2]的值 } int main() { int t,i,j,a,b; bool flag; cin>>t; for(i=1;i<=t;i++) { scanf("%d%d",&n,&m); flag=true; for(j=1;j<=n;j++) { r[j]=0;p[j]=j; } while(m--) { scanf("%d%d",&a,&b); if(flag) { int f1=find(a);int f2=find(b); if(f1==f2) { if(r[a]==r[b]) flag=false; } else unin(a,b,f1,f2); } } printf("Scenario #%d:\n",i); if(flag) printf("No suspicious bugs found!\n"); else printf("Suspicious bugs found!\n"); printf("\n"); } return 0; }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值