UVa 10596 Morning Walk ( 欧拉回路 )

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

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值