hdu - 1878 欧拉回路 无向图欧拉回路的判定 欧拉图知识点

题意:中文题

无向图欧拉回路的判定,可用并查集判是否连通图,度为偶数

        通过图(无向图或有向图)中所有边一次且仅一次行遍图中所有顶点的通路称为欧拉通路,通过图中所有边一次且仅一次行遍所有顶点的回路称为欧拉回路。具有欧拉回路的图称为欧拉图(Euler Graph),具有欧拉通路而无欧拉回路的图称为半欧拉图。
        1 定义
        欧拉通路(Euler tour)——通过图中每条边一次且仅一次,并且过每一顶点的通路。
        欧拉回路 (Eulercircuit)——通过图中每条边一次且仅一次,并且过每一顶点的回路。
        2 无向图是否具有欧拉通路或回路的判定
        G有欧拉通路的充分必要条件为:G 连通,G中只有两个奇度顶点(它们分别是欧拉通路的两个端点)。
        G有欧拉回路(G为欧拉图):G连通,G中均为偶度顶点。
        3 有向图是否具有欧拉通路或回路的判定
        D有欧拉通路:D连通,除两个顶点外,其余顶点的入度均等于出度,这两个特殊的顶点中,一个顶点的入度比出度大1,另一个顶点的入度比出度小1。
        D有欧拉回路(D为欧拉图):D连通,D中所有顶点的入度等于出度。

        (注意:这里说有向图连通,说的是有向图是弱连通图。即把有向图中的边变成无向边,只要该图连通,那么原有向图即是弱连通图。实际中可用并查集判断是否弱连通)

资料源自:https://blog.csdn.net/u013480600/article/details/44805491

链接:hdu 1878

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <set>
#include <map>
#include <stack>
#include <queue>

using namespace std;

const int maxn = 10005;
const int maxm = 1000050;
const int inf = 0x7f7f7f7f;

int n, m;
int fa[maxn];
int degree[maxn];

int findset(int x) {
    if(fa[x] == -1) {
        return x;
    }
    return fa[x] = findset(fa[x]);
}

int main()
{
    while(scanf("%d", &n) && n) {
        scanf("%d", &m);
        memset(degree, 0, sizeof(degree));
        memset(fa, -1, sizeof(fa));
        for(int i = 1; i <= m; i++) {
            int a, b;
            scanf("%d %d", &a, &b);
            degree[a]++;
            degree[b]++;
            a = findset(a);
            b = findset(b);
            if(a != b) {
                fa[a] = b;
            }
        }
        int cnt = 0;
        for(int i = 1; i <= n; i++) {
            if(findset(i) == i) cnt++;
        }
        if(cnt > 1) {
            puts("0");
            continue;
        }
        cnt = 0;
        for(int i = 1; i <= n; i++) {
            if(degree[i] % 2) cnt++;
        }
        if(cnt != 0) puts("0");
        else puts("1");
    }
    return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值