欧拉路径 模板题

82 阅读1分钟

1619. 欧拉路径 - AcWing题库

#include<bits/stdc++.h>
using namespace std;
const int N=510;
int g[N][N];
bool st[N];
int d[N];  //存一下每条边的入度和出度
int n,m;


int dfs(int u)
{
    st[u]=true;  //当前边已经走过了
    int res=1;
    for(int i=1;i<=n;i++)
    {
        if(!st[i]&&g[u][i])   //如果当前边没有走过  并且当前边存在
        res+=dfs(i);          //从当前边开始走
    }
return  res;
}
int main()
{
    cin>>n>>m;
    while(m--)
    {
        int a,b;cin>>a>>b;
        g[a][b]++,g[b][a]++;   //标记一下表示当前边存在
        d[a]++,d[b]++;         //入度+1,出度+1
    }
    
    int cnt=dfs(1);
    
    //输出一下每个点的度数
    cout<<d[1];
    for(int i=2;i<=n;i++)cout<<' '<<d[i];
    cout<<endl;
    
    
    //判断一下是否有解
    if(cnt==n)  //cnt==n说明每条边都走了一遍,说明一定联通
    {
        int s=0;
        for(int i=1;i<=n;i++)
        {
            if(d[i]%2)  //如果是奇点
             s++;       //统计一下奇点的个数
        }
       if(s==0)  //如果奇点个数是0说明全是偶点,那么就是欧拉回路
       cout<<"Eulerian"<<endl;
       else if(s==2)  //欧拉路径的充要条件是: 奇点的个数要么为0要么为2
       cout<<"Semi-Eulerian"<<endl;
       
       else  cout<<"Non-Eulerian"<<endl;
    }
    else  cout<<"Non-Eulerian"<<endl;  //如果不联通那么既不是欧拉回路也不是欧拉路径
    return 0;
}

image.png