题意:有个专家在研究一种虫子,他认为虫子之间的交互只存在于不同性别的虫子之间,输入给定了试验中观察到的两个虫子之间的一些交互,问根据这些输入能否确定专家的意见。
题解:本题有奇环和并查集两种解法。
- DFS判断奇环:易知若用输入的关系构成一无向图,则相同性别之间的交互必定存在于环路中,而且必须是奇环。类似于POJ 2942,可以采用二分染色,用DFS遍历图中的每一条边,当遍历到后向边时(说明有环),且与其祖先的颜色相同则说明存在奇环。
- 并查集:类似于POJ 1703,用集合代表有关系的虫子,集合内元素的关系则可以通过它们和根节点的关系求得。若根据输入中有交互的虫子,查询它们属于同一集合,并且根据以前的输入已知它们属于同一种性别,则它们的交互证明了教授是错的。
DFS奇环:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define maxN 2005
char graph[maxN][maxN];
class solve
{
private:
int N,M,S;
char color[maxN];
public:
solve(int n,int m,int s):N(n),M(m),S(s)
{
memset(graph,0,sizeof(graph));
memset(col