Hierholzer算法dfs找欧拉回路模板

简介: Hierholzer算法dfs找欧拉回路模板

dfs找欧拉回路


#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10,M=2e5+10;
int h[N],e[M*2],ne[M*2],idx;
int n,m;
int t;
int dout[N];
int din[N];
bool vis[M*2];
int p[M*2];
int cnt=0;
void add(int a,int b)
{
    e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
void dfs(int u)
{
    for(int &i=h[u];i;i=ne[i])
    {
        if(vis[i]) continue;
        vis[i]=true;  
        if(t==1) vis[i^1]=true;
        int no;
         if(t==1)
        {
            if((i&1))
            {
              no=-(i/2);
            }else no=i/2;
        }else
        {
            no=i-1;
        }
       int j=e[i];
        dfs(j);
       p[++cnt]=no;
    }
}
int main()
{
    scanf("%d",&t);
    scanf("%d%d",&n,&m);
    idx=2;
    for(int i=1;i<=m;i++)
    {
        int a,b;
        scanf("%d%d",&a,&b);
        add(a,b);
        dout[a]++;
        din[b]++;
        if(t==1) add(b,a);
    }
    if(t==1)
    {
        for(int i=1;i<=n;i++)
        {
            if((din[i]+dout[i])%2!=0)
            {
                cout<<"NO"<<endl;
                return 0;
            }
        }
    }else
    {
        for(int i=1;i<=n;i++)
        {
            if(din[i]!=dout[i])
            {
                cout<<"NO"<<endl;
                return 0;
            }
        }
    }
    for(int i=1;i<=n;i++)
    {
        if(h[i])
        {
            dfs(i);
            break;
        }
    }
    if(cnt!=m)
    {
        cout<<"NO"<<endl;
        return 0;
    }
    cout<<"YES"<<endl;
    for(int i=cnt;i>=1;i--)
    {
        cout<<p[i]<<' ';
    }
    cout<<endl;
}

求逆字典序最小的欧拉路径

#include<bits/stdc++.h>
using namespace std;
const int N=510,M=2000;
int g[N][N];
int m;
int d[N];
int ans[M];
int cnt;
void dfs(int u)
{
    for(int i=1;i<=500;i++)
    {
        if(g[u][i])
        {
            g[u][i]--,g[i][u]--;
            dfs(i);
        }
    }    ans[++cnt]=u;
}
int main()
{
    scanf("%d",&m);
    for(int i=1;i<=m;i++)
    {
        int a,b;
        scanf("%d%d",&a,&b);
        g[a][b]++;
        g[b][a]++;
        d[a]++;
        d[b]++;
    }
    int start=1;
    for(int i=1;i<=500;i++)
    {
        if(d[i]%2)
        {
        start=i;
            break;
        }
    }
    dfs(start);
    for(int i=cnt;i;i--)
    {
        printf("%d\n",ans[i]);
    }
}

求字典序最小的以点表示的欧拉路径

#include <bits/stdc++.h>
using namespace std;
#define x first
#define y second
# define rep(i,be,en) for(int i=be;i<=en;i++)
# define pre(i,be,en) for(int i=be;i>=en;i--)
#define ll long long
#define endl "\n"
#define LOCAL
#define pb push_back
typedef pair<ll, ll> PII;
#define eb emplace_back
#define sp(i) setprecision(i)
const int N = 1e5 + 10, INF = 0x3f3f3f3f;
int din[N];
int dout[N];
vector<int>g[N];
int n,m;
int ans[N*2];
int del[N];
int cnt=0;
stack<int>s;
void dfs(int u)
{
    for(int i=del[u];i<g[u].size();i=del[u])
    {
        del[u]=i+1;
        dfs(g[u][i]);
    }
    //s.push(u);
     ans[++cnt]=u;
}
void solve()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
    {
        int a,b;
        scanf("%d%d",&a,&b);
        g[a].push_back(b);
        din[b]++;
        dout[a]++;
    }
    for(int i=1;i<=n;i++) sort(g[i].begin(),g[i].end());
    int start=1;
    int f1=0;
    int f2=0;
    int sum=0;
    for(int i=1;i<=n;i++)
    {
        if(dout[i]!=din[i])
        {
            sum++;
            if(dout[i]==din[i]+1)
            {
                f2++;
            }else if(dout[i]+1==din[i])
            {
                f1++;
            }
        }
    }
    if(!(sum==0||(sum==2&&f1==1&&f2==1)))
    {
        printf("No\n");
        return;
    }
    for(int i=1;i<=n;i++)
    {
        if(din[i]+1==dout[i])
        {
            start=i;
            break;
        }
    }  
    dfs(start);
    for(int i=cnt;i>=1;i--)
    {
        printf("%d ",ans[i]);
    }
    // while(s.size()) 
    // {
    //     cout<<s.top()<<' ';
    //     s.pop();
    // }
    puts("");
}
signed main() {
// std::ios::sync_with_stdio(false);
//     std::cin.tie(nullptr);
    //#ifdef LOCAL
    //freopen("data.in.txt","r",stdin);
    //freopen("data.out.txt","w",stdout);
    //#endif
    int __ = 1;
    //cin>>__;
    while (__--)
        {
            solve();
        }
    return 0;
}


目录
相关文章
|
8月前
|
存储 算法 决策智能
(万字,细细阅读)竞赛算法入门必经算法模型(附带题目链接和模板)(下)
(万字,细细阅读)竞赛算法入门必经算法模型(附带题目链接和模板)(下)
48 0
|
8月前
|
算法 C++ 容器
(万字,细细阅读)竞赛算法入门必经算法模型(附带题目链接和模板)(上)
(万字,细细阅读)竞赛算法入门必经算法模型(附带题目链接和模板)(上)
28 0
|
6月前
|
算法 Python
Python算法——深度优先搜索(DFS)
Python算法——深度优先搜索(DFS)
261 8
|
7月前
|
算法 C++ 索引
函数模板和类模板 知识点总结 C++程序设计与算法笔记总结(七) 北京大学 郭炜(下)
函数模板和类模板 知识点总结 C++程序设计与算法笔记总结(七) 北京大学 郭炜(下)
25 0
|
15天前
|
算法 前端开发
前端算法 岛屿的最大面积 DFS(深度优先搜索)
前端算法 岛屿的最大面积 DFS(深度优先搜索)
11 0
|
3月前
|
存储 算法 搜索推荐
C++模板与STL【常用算法】
C++模板与STL【常用算法】
|
8月前
|
算法 计算机视觉
基于方向编码的模板匹配算法matlab仿真
基于方向编码的模板匹配算法matlab仿真
|
4月前
|
存储 算法 定位技术
图论算法dijkstra dfs bfs以及动态规划
图论算法dijkstra dfs bfs以及动态规划
35 0
|
9月前
|
算法
1091 zoj Knight Moves的BFS算法和DFS
1091 zoj Knight Moves的BFS算法和DFS
35 0
|
5月前
|
算法 Python
Python 数据结构和算法:解释深度优先搜索(DFS)和广度优先搜索(BFS)。
Python 数据结构和算法:解释深度优先搜索(DFS)和广度优先搜索(BFS)。