HDU-1829 A Bug's Life (带权并查集)

来源:互联网 发布:淘宝平铺拍摄价格 编辑:程序博客网 时间:2024/06/05 16:40

终于自己做出来第一个带权并查集了!!!

虽然这题和真正的难题有一定差距,毕竟第一次尝试嘛,还算顺利。

这题就是给出的两个数,不是同一个性别,比如给出1 3,1和3就不是同一种性别,如果有说明和上面的情况矛盾,就输出Suspicious bugs found!,如果所有情况都没有矛盾的话,输出No suspicious bugs found!。

0表示同类,1表示不同类。

#include<iostream>#include<cstdio>#include<cctype>#include<cstdlib>#include<cmath>#include<algorithm>#include<cstring>#include<string>#include<vector>#include<queue>#include<map>#include<set>#include<sstream>#include<stack>using namespace std;#define MAX 2000+5typedef long long LL;const double pi=3.141592653589793;const int INF=1e9;const double inf=1e20;const double eps=1e-10;const int mod=1000000007;int fa[MAX];int tmp[MAX];int Find(int x){if(fa[x]==x) return fa[x];int tem=fa[x];fa[x]=Find(fa[x]);tmp[x]=(tmp[x]+tmp[tem])%2;return fa[x];}void Union(int a,int b,int c,int d){fa[c]=d;tmp[c]=(tmp[a]+tmp[b]+1)%2;}int main(){int t,kase=0;cin>>t;while(t--){kase++;int n,m;int flag=0;scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){fa[i]=i;tmp[i]=0;}for(int i=0;i<m;i++){int a,b;scanf("%d%d",&a,&b);if(!flag){int c=Find(a);int d=Find(b);if(c!=d) Union(a,b,c,d);else{if(tmp[a]==tmp[b]){printf("Scenario #%d:\nSuspicious bugs found!\n",kase);flag=1;}}}else continue;}if(!flag) printf("Scenario #%d:\nNo suspicious bugs found!\n",kase);printf("\n");}return 0;}



0 0
原创粉丝点击