UVa 10596 Morning Walk ( 欧拉回路 )

来源:互联网 发布:高速网络不稳定 编辑:程序博客网 时间:2024/04/30 19:20

有一段时间不写并查集了,结果写的时候手生,写错了!

老大给了这道题, 我开始以为老大给的应该是搜索的题目,分析了一下,搜索是可以做的,但是搜的过程比较麻烦,后来看到了 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");    }}                          


原创粉丝点击