[并查集] HDU 1878

欧拉回路
通过图中每条边且只通过一次,并且经过每一顶点的回路。
无向图欧拉回路判定
图连通;图中所有节点度均为偶数

思路:利用并查集先判断图连通性,同时记录每个点的度数

判断条件
1. 当一个点的根节点与其他点的根节点不等,则不连通
2. 当该点的度数是奇数时,则非欧拉图

#include <cstring>
#include <iostream>

using namespace std;

const int N = 100000;

int degree[ N ];
int Father[ N ];

int Find ( int x ) { return ( Father[ x ] == x ) ? x : Father[ x ] = Find ( Father[ x ] ); }

void Union ( int u, int v ) {
        int f1 = Find ( u );
        int f2 = Find ( v );

        if ( f1 != f2 )
                Father[ f1 ] = f2;
}

int main () {
        int n, m;
        while ( scanf ( "%d", &n ) && n ) {
                scanf ( "%d", &m );

                memset ( degree, 0, sizeof ( degree ) );

                for ( int i = 1; i <= n; ++i )
                        Father[ i ] = i;

                int u, v;
                for ( int i = 1; i <= m; ++i ) {
                        scanf ( "%d%d", &u, &v );
                        Union ( u, v );
                        ++degree[ u ];
                        ++degree[ v ]; // 记录每个点的度数
                }

                int flag = 1;
                int tmp = Find ( 1 );
                for ( int i = 1; i <= n; ++i ) {
                        if ( Find ( i ) != tmp ) { //不存在回路
                                flag = 0;
                                break;
                        }
                        if ( degree[ i ] & 1 ) { //有奇度顶点
                                flag = 0;
                                break;
                        }
                }

                printf ( "%d\n", flag );
        }

        return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值