欧拉回路

Posted Only U - IU

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了欧拉回路相关的知识,希望对你有一定的参考价值。

 

求欧拉回路dfs代码:

#include <cstdio>
#include <iostream>

using namespace std;

int n,m,dis[101],dis_=0,root=0x7fffffff,path[10001],now=0;

bool map[101][101],ok=false,if_[101];

void euler(int now,int gra)
{
    path[gra]=now;
    if(gra==m+1)
    {
        ok=true;
        return ;
    }
    for(int i=1;i<=n;i++)
    {
        if(map[now][i])
        {
            map[now][i]=false;
            map[i][now]=false;
            euler(i,gra+1);
            if(ok) return;
            map[now][i]=true;
            map[i][now]=true;
        }
    }
}

void euler_back(int now,int gra)
{
    path[gra]=now;
    if(gra==m+1)
    {
        if(now==root) ok=true;
        return ;
    }
    for(int i=1;i<=n;i++)
    {
        if(map[now][i]&&!if_[i])
        {
            map[now][i]=false;
            map[i][now]=false;
            euler_back(i,gra+1);
            if(ok) return;
            map[i][now]=true;
            map[now][i]=true;
        }
    }
}

int main()
{
    scanf("%d%d",&n,&m);
    int from,to;
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d",&from,&to);
        map[from][to]=true;
        map[to][from]=true;
        dis[from]++,dis[to]++;
    }
    for(int i=1;i<=n;i++)
    {
        if(dis[i]%2)
        {
            root=min(i,root);
            dis_++;
        }
    }
    if(dis_==2)
    {
        if_[root]=true;
        euler(root,1);
        if(ok)
        {
            cout<<"true 1"<<endl;
            for(int i=1;i<=m;i++) cout<<path[i]<<\' \';
        }
        else cout<<"false"<<endl;
        cout<<endl;
    }
    else
    {
        if(!dis_)
        {
            euler_back(1,1);
            if(ok)
            {
                cout<<"true 2"<<endl;
                for(int i=1;i<=m;i++) cout<<path[i]<<" ";
            }
            else cout<<"false";
            cout<<endl;
        }
        else
        {
            cout<<"false"<<endl;
        }
    }
    return 0;
}

 

以上是关于欧拉回路的主要内容,如果未能解决你的问题,请参考以下文章

[P1341]无序字母对 (欧拉回路)

欧拉回路

求图中欧拉回路数量

UVA 10054 - The Necklace(欧拉回路)

P1341 无序字母对(欧拉回路)

UOJ - #117. 欧拉回路(模板)