题目链接:http://poj.org/problem?id=2492
Time Limit: 10000MS | Memory Limit: 65536K | |
Total Submissions: 27388 | Accepted: 8907 |
Description
Input
Output
Sample Input
2 3 3 1 2 2 3 1 3 4 2 1 2 3 4
Sample Output
Scenario #1: Suspicious bugs found! Scenario #2: No suspicious bugs found!
题目意思就是 给定n只虫子 不同性别的可以在一起 相同性别的不能在一起
给你m对虫子 判断中间有没有同性别在一起的;
我们把同性的放到一个集合里 如果一个集合里出现了异性 则说明存在同性恋在一起
假设 x 为一种性别 x+n为与其相反的性别
若a,b为同性 的 我们则可以把判断 (a,b+n) (b,a+n)为异性反之亦然;
代码如下:
#include <iostream> #include <cstring> #include <cstdio> using namespace std; const int maxn = 5000; int par[maxn]; void init(int n){ for(int i=0;i<=n;i++) par[i]=i; } int find(int x){ if(x!=par[x]) par[x]=find(par[x]); return par[x]; } void Union(int a,int b){ int x=find(a); int y=find(b); if(x!=y) par[x]=y; } bool judge(int x,int y){//判断是否为同性,异性为真,同性为假 x=find(x); y=find(y); if(x!=y) return true; return false; } int main() { int t,n,m,cas=1; scanf("%d",&t); for(int i=1;i<=t;i++){ scanf("%d%d",&n,&m); init(n*2); bool l=1; int x,y; while(m--){ scanf("%d%d",&x,&y); if(judge(x,y)||judge(x+n,y+n)){ Union(x,y+n);//把同性的加到一个集合里 Union(x+n,y); } else l=0; } if(i!=1) puts(""); printf("Scenario #%d:\n",cas++); if(l) printf("No suspicious bugs found!\n"); else printf("Suspicious bugs found!\n"); } return 0; }