**
航电oj:A Bug’s Life
**
#题目描述
#大意是你输入的数表示的是这俩的不同 问你输入中有没有bug
#看有没有bug 要看在这之前的输入数据和这个数据有没有矛盾 这种有无bug 矛盾的一般都是并查集
#知识点
状态并查集
#代码
#include<cstdio>
#include<cstring>
#include<stdio.h>
#include<algorithm>
#include<iostream>
using namespace std;
int father[2002];
int sum[2002];//这个点到根的状态 1 不同 0 相同
int find_m(int x)
{
if(x == father[x])
{
return x;
}else
{
int temp = father[x];
father[x] = find_m(father[x]);//状压
sum[x] = (sum[x] + sum[temp])%2;//两个状态
return father[x];
}
}
int main()
{
int t;
cin >> t;
int cnt = 0;
while(t--)
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=0;i<=n;i++)
{
father[i] = i;
sum[i] = 0;
}
int flag = 0;
int a,b;
for(int i=1;i<=m;i++)
{
//cin >> a >> b;
scanf("%d%d",&a,&b);
int ra = find_m(a);
int rb = find_m(b);
if(ra == rb)
{
if((sum[b] - sum[a])%2 == 0)//有矛盾 数据数据是不同的 这个却相同 有矛盾
{
flag = 1;
}
// if(sum[a] == sum[b])//同样效果
// {
// flag = 1;
// }
}else
{
father[ra] = rb;
sum[ra] = (1 + sum[b] - sum[a])%2;
}
}
if(flag == 1)
{
cout << "Scenario #"<<++cnt<<":"<<endl;
cout << "Suspicious bugs found!"<<endl;
cout << endl;
}else
{
cout << "Scenario #"<<++cnt<<":"<<endl;
cout << "No suspicious bugs found!"<<endl;
cout << endl;
}
}
return 0;
}
#总结
便于理解