题意:给定一系列数对,然后不断的给出这样的数对,问有没有性别不对的情况。
解题思路:并查集的简单应用,就是同性别的合并在一个集合中,然后每次输入看u,v是否在同一个集合中
AC源码
#include<iostream>
#include<stdio.h>
#include<cstdio>
#define N 2005
using namespace std;
int f[N],rank[N], n, k;
bool flag;
inline void init(){
flag=false;
for(int i=0; i<=n; ++i)
f[i]=i, rank[i]=0;
}
int find(int x){
if(x==f[x])return f[x];
int t=find(f[x]);
rank[x] = (rank[f[x]]+rank[x])&1;
f[x]=t;
return f[x];
}
void Union(int x, int y){
int a=find(x), b=find(y);
if(a==b){
if(rank[x]==rank[y])
flag=true;
return;
}
f[a]=b;
rank[a] = (rank[x]+rank[y]+1)&1;
}
int main(){
int T,a,b,cas=1;
cin>>T;
while(T--){
cin>>n>>k;
init();
for(int i=0; i<k; ++i){
cin>>a>>b;
if(flag)continue;
Union(a,b);
}
cout<<"Scenario #"<<cas++<<endl;
if(flag)cout<<"Suspicious bugs found!"<<endl;
else cout<<"No suspicious bugs found!"<<endl;
cout<<endl;
}
return 0;
}
Problem S
Time Limit : 15000/5000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 23 Accepted Submission(s) : 8
2 3 3 1 2 2 3 1 3 4 2 1 2 3 4
Scenario #1: Suspicious bugs found! Scenario #2: No suspicious bugs found! <div style='font-family:Times New Roman;font-size:14px;background-color:F4FBFF;border:#B7CBFF 1px dashed;padding:6px'><div style='font-family:Arial;font-weight:bold;color:#7CA9ED;border-bottom:#B7CBFF 1px dashed'><i>Hint</i></div>Huge input,scanf is recommended.</div>