题意:
针对实验结果来验证教授的假设是否成立。每行给出一个a和b表示a和b是异性的, 让我们来验证这种假设对于所有的实验结果是否会出现矛盾。
思路:
并查集,用一个数组来维护集合中每个元素与头结点是否同姓,同姓标为0,异性标为1。
代码如下:
const int M = 2005;
int p[M], flag[M];
void init(int n)
{
memset(flag,0,sizeof(flag));
for(int i = 0; i <= n; ++i) p[i] = i;
}
int find(int x)
{
int tmp = p[x];
p[x] = (p[x]==x?x:find(p[x]));
flag[x] = (flag[tmp]^flag[x]);
return p[x];
}
int main()
{
int n, m, t, ans, a, b, k = 0;
scanf("%d",&t);
while(t--)
{
ans = 0;
scanf("%d%d", &n, &m);
init(n);
for(int i = 0; i < m; ++i)
{
scanf("%d%d", &a, &b);
if(ans==-1) continue;
int x = find(a);
int y = find(b);
if(x!=y)
{
p[x] = y;
flag[x] = (flag[a]^flag[b]^1);
}
else if(flag[a]==flag[b])
ans = -1;
}
if(k) printf("\n");
printf("Scenario #%d:\n", ++k);
if(ans==-1) puts("Suspicious bugs found!");
else puts("No suspicious bugs found!");
}
return 0;
}