AcWing 1619. 欧拉路径
原题链接
简单
作者:
哈基咪
,
2020-09-13 09:45:43
,
所有人可见
,
阅读 485
//欧拉路径
//欧拉图:连通图&&所有顶点度数为偶数
//半欧拉图:连通图&&两个顶点的度数为奇数
//非欧拉图:不是连通图 ||连通图 &&奇数度数的点数不是0也不是2
//大致思路:统计每个点的度数,再得出奇数度数的点的个数,并且同时判断图的连通性。
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int N=505;
int n,m;
int graph[N][N],st[N],digree[N];//graph来标记边之间是否连通,st用于遍历图的连通性
int t,cnt;//digree记录各结点 度数,t记录奇数度数的个数, cnt 标记连通结点的个数
void dfs(int u)//从第u个结点开始遍历图
{
st[u]=true;
cnt++;
for(int i=1;i<=n;i++)
{
if(graph[u][i]&&!st[i])
{
dfs(i);
}
}
}
int main()
{
scanf("%d%d",&n,&m);
int a,b;
for(int i=0;i<m;i++)
{
scanf("%d%d",&a,&b);
graph[a][b]=graph[b][a]=1;
digree[a]++,digree[b]++;
}
//统计奇数度数点的个数
for(int i=1;i<=n;i++)
{
cout<<digree[i]<<' ';
if(digree[i]%2!=0)
{
t++;
}
}
cout<<endl;
//判断连通性
dfs(1);
//若为连通图
if(cnt==n)
{
if(t==0)
{
cout<<"Eulerian"<<endl;
}
else if(t==2)
{
cout<<"Semi-Eulerian"<<endl;
}
else cout<<"Non-Eulerian"<<endl;
}
else
cout<<"Non-Eulerian"<<endl;
return 0;
}