ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

有向图与无向图:欧拉路径&欧拉回路(一笔画)

2022-04-20 21:33:59  阅读:229  来源: 互联网

标签:ch bullet int 路径 有向图 回路 include 欧拉


咕了好久的图论的一小小小部分。

1、定义

欧拉路径不重复经过图上每一条边的路径 

欧拉回路 : 起止点相同的欧拉路径

2、判定

$\bullet$ 有向图

  $\bullet$  欧拉路径 :图中有且仅有 $1$ 个点出度入度多 $1$ ,为起点;图中有且仅有 $1$ 个点入度出度多 $1$ ,为终点;其余节点 入度 $=$ 出度。

  $\bullet$  欧拉回路 :图中所有点 入度 $=$ 出度,起止点为任意点。

$\bullet$ 有向图

    $\bullet$  欧拉路径 :图中仅有 $2$ 个点度数奇数,其余点度数偶数,这两个奇数点可以任意选为起点终点。

    $\bullet$  欧拉回路 :所有点度数都是偶数,起止点任意。

其实这些概念还是很好理解的,有进就有出,否则肯定有走不通的,回路就是起止点连在一起了。

3、寻找

假设我们已经选好起点,那么一次对图的 dfs 即可求出,我们只需要用栈记录即可。

注意!如果题中要求按字典序,那最好是用 vector 或者邻接矩阵。

附上例题:传送门~

哦对了,无向图的最好是只用邻接矩阵,不然删边很麻烦的!!

例题代码,算是有向图欧拉路径的板子,一个通了别的也通了。

#include<cstdio>
#include<queue>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cctype>
#include<vector>
#include<string>
#include<climits>
#include<stack>
using namespace std;
template <typename T>
inline void read(T &x){
    x=0;char ch=getchar();bool f=0;
    while(ch<'0'||ch>'9'){if(ch=='-')f=1;ch=getchar();}
    while(ch>='0'&&ch<='9')x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
    if(f)x=-x;
}
template <typename T,typename ...Args>
inline void read(T &tmp,Args &...tmps){read(tmp);read(tmps...);}
const int N = 1e6 + 5;
int in[N],out[N],n,m,now[N];
vector<int>g[N];
stack<int>s;
int flag = 1,cnt[2],st = 1;
inline void dfs(int u){
    for(int i=now[u];i<g[u].size();i=now[u]){
        now[u] = i + 1;//避免重复走
        dfs(g[u][i]);
    }
    s.push(u);//记录,也可以手写栈更快
}
signed main(){
    read(n,m);
    for(int i=1;i<=m;++i){
        int u,v;
        read(u,v);
        g[u].push_back(v);
        in[v]++;
        out[u]++;   //统计结点入度出度,如果是无向图统一一个数组记录度
    }
    for(int i=1;i<=n;++i)sort(g[i].begin(),g[i].end());//题里要字典序,忽略啦~
    for(int i=1;i<=n;++i){
        if(in[i] != out[i])flag = 0;
        if(out[i] == in[i] + 1)cnt[1]++,st = i;
        if(in[i] == out[i] + 1)cnt[0]++;    
    }
    if((!flag) && !(cnt[0] == cnt[1] && cnt[0] == 1))return printf("No"),0;//既没有回路也没有路径
    dfs(st);
    while(!s.empty())printf("%d ",s.top()),s.pop();//输出
}

 

标签:ch,bullet,int,路径,有向图,回路,include,欧拉
来源: https://www.cnblogs.com/wsxxs/p/16171800.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有