欧拉图简述---(一笔画问题)

主要参考大佬博客:https://blog.csdn.net/u011815404/article/details/86590498

欧拉图

欧拉图是在大家小学时学奥数都学习过的一个类型的题,无论你学得好不好,你都听过它的另外一个名字:一笔画问题;

一,首先来定义一下:

1.欧拉回路:图G的一个回路,如果恰通过图G的每一条边,则该回路称为欧拉回路,具有欧拉回路的图称为欧拉图。欧拉图就是从图上的一点出发,经过所有边且只能经过一次,最终回到起点的路径。

2.欧拉通路:即可以不回到起点,但是必须经过每一条边,且只能一次。也叫"一笔画"问题。

3.基图:基图是针对有向图的说法,是忽略有向图的方向得到的无向图。

4.欧拉图:存在欧拉回路的图。

欧拉回路一定要首尾相连,,通路不一定。

二.性质与定理

先说说有向图和无向图,显而易见,有向图就是有向的图,而无向图反之亦然。

呃,,此处及以下全转载至大佬博客:https://blog.csdn.net/qq_35649707/article/details/75578102

性质与定理

定理1

无向图G为欧拉图,当且仅当G为连通图且所有顶点的度为偶数。

证明: 必要性

设图G的一条欧拉回路为C。由于C经过图G的每一条边,而图G没 有孤立点,所以C也经过图G的每一个顶点,G为连通图成立。而对于图G的任意一个顶点 v,经过C时都是从一条边进入,从另一条边离开,因此v经过C的关联边的次数为偶数。又由于C不重复地经过了图G的每一条边,因此 的度为偶数。

充分性

假设图G中不存在回路,而G是连通图,故 一定是G树,那么有|E|=|V|−1 |E|=|V|−1|E|=|V|-1由于图G所有顶点的度为偶数而且不含孤立点,那么图G的每一个顶点的度至少为2。

推论1

无向图G为半欧拉图,当且仅当G为连通图且除了两个顶点的度为奇数之外, 其它所有顶点的度为偶数。

证明:将两个度为奇数的顶点连接,由定理一得该图为欧拉图,故去掉环上一边为半欧拉图。

定理2

有向图G为欧拉图,当且仅当G的基图连通,且所有顶点的入度等于出度。

推论2

有向图G为半欧拉图,当且仅当G的基图连通,且存在顶点u的入度比出度大1 、v的入度比出度小 1,其它所有顶点的入度等于出度。证明同定理1相似。

性质1

设C是欧拉图G中的一个简单回路,将C中的边从图G中删去得到一个新的图G  ′   ′^{‘},则 G  ′   ′^{‘}的每一个极大连通子图都有一条欧拉回路。

证明  若G为无向图,则图G  ′   ′^{‘}的各顶点的度为偶数;若G为有向图,则图 G  ′   ′^{‘}的各顶点的入度等于出度。

性质2

设 C1、C2是图G的两个没有公共边,但有至少一个公共顶点的简单回路,我们可以将它们合并成一个新的简单回路 。

三.如何判定(是不是欧拉回路/图)

以下全是我个人理解,完全依据于小奥的学习经验,不一定全对,有错请指出。

我说的尽量简单一点:

首先每一个点都有它的度:即与它相连的边的个数

我们把奇度的点称为奇点,反之偶点

根据奥数知识一句话则可以判断无向图是否是欧拉图:有0或2个奇点

但是对于有向图判断则复杂一些:每条边只经过一次而且每个点也只过一次

四。如何实现判定

下面用一道模板题来简述一下吧。附:欧拉树的题往往无法判断是图论题

见下:

题目描述

给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒)。请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现。

输入输出格式

输入格式:

第一行输入一个正整数n。

以下n行每行两个字母,表示这两个字母需要相邻。

输出格式:

输出满足要求的字符串。

如果没有满足要求的字符串,请输出“No Solution”。

如果有多种方案,请输出前面的字母的ASCII编码尽可能小的(字典序最小)的方案

输入样例#1:  输出样例#1:

4             XaZtX
aZ
tZ
Xt
aX是不是很迷?但是附上代码你就会懂了。。。。
#include<iostream>
#include<cstdio>
#include<cstdlib>

using namespace std;
int a[500][500];
int du[200];
char lu[500];

void Find(int now)
{
    for(int i = ‘A‘;i <= ‘z‘;++ i){//字典序从小开始找
        if(a[now][i]){
            a[now][i] = 0;
            a[i][now] = 0;
            Find(i);
        }
    }
    lu[++k] = now;//题目要求记录的路径
}

int main()
{
    int n;
    cin>>n;
    char x,y;
    for(int i = 1;i <= n;++ i)
    {
        cin >> x >> y;
        a[x][y] = 1;
        a[y][x] = 1;
        du[x] ++;//此处du数组记录了每个点的度数
        du[y] ++;
    }
    for(int i = ‘z‘;i >= ‘A‘;-- i)
    {
        if(du[i] % 2==1)
            start = i,m ++;//m记录图中奇数度数点的个数,同时将起点start定为此点
    }
    if(m != 0&&m != 2)
    {//由欧拉图的性质可得,如果一个图奇数度数点个数不为0或2则不存在欧拉路径
        cout << "No Solution";
        return 0;
    }
    if(m == 0)
    {//当图中所有点为偶数度数时,图中存在欧拉回路,只需要找到字典序最小的点作起点start
        for(int i = ‘A‘;i <= ‘z‘;++ i)
            if(du[i])
            {
                start = i;
                break;
            }
            Find(start);
    }
    int str=strlen(lu);
    for(int j=1;j<=str;j++)
        cout<<lu[j];
    cout<<endl;
    return 0;
}

好了,欧拉图就掌握到模板题吧,,对我而言

如果大佬们想刷题

请见:

模板题: poj:1041 john’s trip

http://poj.org/problem?id=1041

(无向图欧拉回路&路径输出,模板题,很经典。)

hdu:3018 ant trip

http://acm.hdu.edu.cn/showproblem.php?pid=3018

(并查集:欧拉回路的问题)

一般难度: POJ:1386 Play on Words

http://poj.org/problem?id=1386

(判定有向图图欧拉路径是否存在)

POJ 1300 Door Man

http://poj.org/problem?id=1300

(无向图欧拉通路和回路的判定+并查集)

究极难度:

大视野oj:太鼓达人

https://www.lydsy.com/JudgeOnline/problem.php?id=3033

这道题是无意中翻到的,完全没看出来是欧拉图。需要强大的数学功底才能进行转化(要用欧拉回路判定+dfs+回溯做)。

这里选了一个题解(思路讲的较为清晰,有图解)

太鼓达人题解

https://blog.csdn.net/Clove_unique/article/details/70160122

uva:10735

是道紫题,此处给的是洛谷传送门

https://www.luogu.org/problemnew/show/P3372

洛谷题解挺详细,大家可以看看。

poj:1637 Sightseeing tour

http://poj.org/problem?id=1637

一道好题,网络流加混合欧拉图(大佬如是说)。

原文地址:https://www.cnblogs.com/liuyuhao040610/p/11237039.html

时间: 2024-08-28 06:51:22

欧拉图简述---(一笔画问题)的相关文章

nyoj42一笔画问题(欧拉图)

这题其实说不上难度4,只是一个简单的欧拉图判断,给一些点,首先判断连通性.如果不连通,就谈不上是欧拉图. 如果是连通的,在判断度的数目,每个顶点都是偶数个或者只有两个是奇数个.这样就可以构成欧拉图. 一笔画问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 zyc从小就比较喜欢玩一些小游戏,其中就包括画一笔画,他想请你帮他写一个程序,判断一个图是否能够用一笔画下来. 规定,所有的边都只能画一次,不能重复画. 输入 第一行只有一个正整数N(N<=10)表示测试数据的

nyoj-一笔画问题-欧拉图+联通判定

一笔画问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 zyc从小就比较喜欢玩一些小游戏,其中就包括画一笔画,他想请你帮他写一个程序,判断一个图是否能够用一笔画下来. 规定,所有的边都只能画一次,不能重复画. 输入 第一行只有一个正整数N(N<=10)表示测试数据的组数.每组测试数据的第一行有两个正整数P,Q(P<=1000,Q<=2000),分别表示这个画中有多少个顶点和多少条连线.(点的编号从1到P)随后的Q行,每行有两个正整数A,B(0<A,

NYOJ 题目42 一笔画问题(欧拉图)

一笔画问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描写叙述 zyc从小就比較喜欢玩一些小游戏.当中就包含画一笔画.他想请你帮他写一个程序.推断一个图是否可以用一笔画下来. 规定,全部的边都仅仅能画一次,不能反复画. 输入 第一行仅仅有一个正整数N(N<=10)表示測试数据的组数. 每组測试数据的第一行有两个正整数P,Q(P<=1000,Q<=2000).分别表示这个画中有多少个顶点和多少条连线.(点的编号从1到P) 随后的Q行.每行有两个正整数A,B(0

深度优先搜索——一笔画问题(欧拉图问题)

题目描述 zyc从小就比较喜欢玩一些小游戏,其中就包括画一笔画,他想请你帮他写一个程序,判断一个图是否能够用一笔画下来. 规定,所有的边都只能画一次,不能重复画. 输入 第一行只有一个正整数N(N<=10)表示测试数据的组数.每组测试数据的第一行有两个正整数P,Q(P<=1000,Q<=2000),分别表示这个画中有多少个顶点和多少条连线.(点的编号从1到P)随后的Q行,每行有两个正整数A,B(0<A,B<P),表示编号为A和B的两点之间有连线. 输出 如果存在符合条件的连线

nyoj42 一笔画问题

题目链接 分析: 若图G中存在这样一条路径,使得它恰通过G中每条边一次,则称该路径为欧拉路径.若该路径是一个圈,则称为欧拉(Euler)回路. 具有欧拉回路的图称为欧拉图(简称E图).具有欧拉路径但不具有欧拉回路的图称为半欧拉图. 先说一下欧拉路径.欧拉回路的充要条件: 1.无向连通图G是欧拉图,当且仅当G不含奇数度结点(G的所有结点度数为偶数): 2.无向连通图G含有欧拉通路,当且仅当G有零个或两个奇数度的结点: 3.有向连通图D是欧拉图,当且仅当该图为连通图且D中每个结点的入度=出度 4.有

nyist 42 一笔画 (欧拉回路 + 并查集)

nyoj42 分析: 若图G中存在这样一条路径,使得它恰通过G中每条边一次,则称该路径为欧拉路径. 若该路径是一个圈,则称为欧拉(Euler)回路. 具有欧拉回路的图称为欧拉图(简称E图).具有欧拉路径但不具有欧拉回路的图称为半欧拉图. 先说一下欧拉路径.欧拉回路的充要条件: 1.无向连通图G是欧拉图,当且仅当G不含奇数度结点(G的所有结点度数为偶数): 2.无向连通图G含有欧拉通路,当且仅当G有零个或两个奇数度的结点: 3.有向连通图D是欧拉图,当且仅当该图为连通图且D中每个结点的入度=出度

NYOJ 42 一笔画问题

一笔画问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 zyc从小就比较喜欢玩一些小游戏,其中就包括画一笔画,他想请你帮他写一个程序,判断一个图是否能够用一笔画下来. 规定,所有的边都只能画一次,不能重复画. 输入 第一行只有一个正整数N(N<=10)表示测试数据的组数. 每组测试数据的第一行有两个正整数P,Q(P<=1000,Q<=2000),分别表示这个画中有多少个顶点和多少条连线.(点的编号从1到P) 随后的Q行,每行有两个正整数A,B(0<

NYOJ42 一笔画问题 【欧拉回路】+【并查集】

一笔画问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 zyc从小就比较喜欢玩一些小游戏,其中就包括画一笔画,他想请你帮他写一个程序,判断一个图是否能够用一笔画下来. 规定,所有的边都只能画一次,不能重复画. 输入 第一行只有一个正整数N(N<=10)表示测试数据的组数. 每组测试数据的第一行有两个正整数P,Q(P<=1000,Q<=2000),分别表示这个画中有多少个顶点和多少条连线.(点的编号从1到P) 随后的Q行,每行有两个正整数A,B(0<

【编程马拉松】【019-一笔画】

[编程马拉松算法目录] [019-一笔画][工程下载>>>] 1 题目描述 咱们来玩一笔画游戏吧,规则是这样的:有一个连通的图,能否找到一个恰好包含了所有的边,并且没有重复的路径. 1.1 输入描述: 输入包含多组数据.每组数据的第一行包含两个整数n和m (2≤n, m≤1000),其中n是顶点的个数,m是边的条数.紧接着有m行,每行包含两个整数from和to (1 ≤ from, to ≤ n, from != to),分别代表边的两端顶点.边是双向的,并且两个顶点之间可能不止一条边.