有一段时间不写并查集了,结果写的时候手生,写错了!
老大给了这道题, 我开始以为老大给的应该是搜索的题目,分析了一下,搜索是可以做的,但是搜的过程比较麻烦,后来看到了 a single walk,看来就是一笔换的问题的,需要回到home,连回家的过程都不能走原来的路,所以是回路!我看了好几遍题目,才读得彻底,它其实是个无向图的欧拉回路!
说一点体外话,与题目关系不大,我觉得ACM最重要的,除了学习各种算法以外,还有就是分析问题,找到问题的最本质,然后解决问题!
所以说,分析问题的能力是非常重要的……
接下来,代码如下:
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int N = 200;
bool isfind;
int n, m, ans, f[N], a[N];
int tofind( int x ) {
return f[x] == x ? x : f[x] = tofind( f[x] );
}
int main()
{
while ( scanf("%d%d", &n, &m) != EOF ) {
memset( a, 0, sizeof(a) );
isfind = true; ans = 0;
for ( int i = 0; i < n; ++i ) f[i] = i;
for ( int i = 0, s, t; i < m; ++i ) {
scanf("%d%d", &s, &t);
a[s]++, a[t]++;
int a = tofind( s );
int b = tofind( t );
if ( a != b ) f[a] = b;
}
for ( int i = 0, num = 0; i < n && isfind; ++i ) {
if ( tofind(i) == i ) num++;
if ( num > 1 ) isfind = false;
}
for ( int i = 0; i < n && isfind; ++i ) {
if ( a[i] % 2 ) {
isfind = false;
break;
}
}
if ( isfind ) printf("Possible\n");
else printf("Not Possible\n");
}
}