首页 > 代码库 > hdu 1829 A Bug's Life 并查集
hdu 1829 A Bug's Life 并查集
点击打开链接 http://acm.hdu.edu.cn/showproblem.php?pid=1829
题意:给出n个关系啊a,b,表示a和b是异性,问是否存在矛盾,即存在a和b是同性。
思路,并查集,用f[i]记录i的父亲,next[i]表示同一个集合里的下一个元素,根据next数组可以遍历出一个集合里的所有元素,len[i]表示i和集合的根的关系,0表示同性,1表示异性。 每输入一个a和b,找到他们的根,如果根相等,那么就判断他们和根的关系,如果和根都是同性关系或者都是异性关系,则表示a和b同性,就矛盾,如果是异性就不矛盾。如果他们的根不想等,那么就把他们两个集合合并到一起,首先把一个集合的根的父亲指向另一个集合的根,再循环next数组,找到集合里的所有元素,把第一个集合里的所有元素的和新根的关系进行更行。
#include<cstdio> #include<cstring> #include<iostream> using namespace std; const int maxn=2010; int f[maxn]; int next[maxn]; int len[maxn]; int n,m; int fin(int x){ if(x==f[x]) return f[x]; f[x]=fin(f[x]); return f[x]; } void Union(int a,int b,int fa,int fb){ int x=len[a]; len[a]=(len[b]+1)%2; for(int i=next[a];i!=a;i=next[i]){ len[i]=(len[i]+x+1+len[b])%2; } swap(next[a],next[b]); f[fa]=fb; return ; } int main() { int cas; cin>>cas; int ca=1; while(cas--){ for(int i=0;i<maxn;i++){ f[i]=i; next[i]=i; len[i]=0; } int flag=1; cin>>n>>m; int a,b; for(int i=0;i<m;i++){ scanf("%d %d",&a,&b); int fa=fin(a); int fb=fin(b); if(fa==fb){ if(len[a]==len[b]) flag=0; } else Union(a,b,fa,fb); } printf("Scenario #%d:\n",ca++); if(!flag) cout<<"Suspicious bugs found!"<<endl<<endl; else cout<<"No suspicious bugs found!"<<endl<<endl; } return 0; }
hdu 1829 A Bug's Life 并查集
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。