2492 A Bug's Life (帶權並查集)
阿新 • • 發佈:2019-02-10
解題思路:d[i]=0表示父節點同性 d[i]==1 表示與父節點異性
#include<iostream> #include<cstdio> #include<vector> #include<algorithm> #include<cstring> using namespace std; #define rep(i,j,k) for(int i=j;i<=k;i++) #define sca(x) scanf("%d",&x) #define per(i,j,k) for(int i=j;i>=k;i--) #define inf 0x3f3f3f3f #define mod 1000000007 #define LL long long #define N 200005 int f[N],d[N]; int F(int x) { if(f[x]==x)return x; int fa=f[x]; f[x]=F(f[x]); d[x]=(d[x]+d[fa])%2; return f[x]; } int U(int x,int y) { int f1=F(x); int f2=F(y); if(f1==f2&&d[x]==d[y])return 0;//如果x y為異性那麼他們與父節點的關係應該不同。 else { f[f1]=f2; d[f1]=(3+d[y]-d[x])%2; return 1; } } int main() { int t; cin>>t; int cas=1; while(t--) { int n,m; scanf("%d%d",&n,&m); rep(i,1,n)f[i]=i,d[i]=0; int flag=0; rep(i,1,m) { int x,y; scanf("%d%d",&x,&y); if(!U(x,y)) { flag=1; } } printf("Scenario #%d:\n",cas++); if(flag)printf("Suspicious bugs found!\n"); else printf("No suspicious bugs found!\n"); printf("\n"); } }