首页 > 代码库 > 欧拉回路

欧拉回路

 

求欧拉回路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;}

 

欧拉回路