描述
输入一个无向连通图,判断这个图是否存在欧拉回路,如果没有则输出“no oula circle”,如果有,输出以结点1开始的一条欧拉回路,回路上结点序号优先小的。
输入描述
第一行一个整数 n 和 m,表示这个图有 n 个结点、m 条边,接下来 m 行,每行两个整数 ai 和 aj,表示结点 ai 和 aj之间有一条边。
输出描述
如果不存在欧拉回路,请输出“no oula circle”,如果有欧拉回路,请输出结点 1 开始的欧拉回路的结点编号。
#include <iostream>
using namespace std;
//arr记录邻接矩阵 dot记录奇点(每个点连接边数量) ans数组存储结果
int arr[105][105],dot[105],n,m,ans[105];
//记录奇点
int start[3], sum=0;
//x正在到达的结点 cnt是数组ans的下标
void dfs(int x,int cnt){
//边界条件:1.找到了奇点1/奇点2 2.欧拉回路:所有路径都走过一次
if((x==start[1]||x==start[2])&&sum==m){
//输出
for(int i=1; i<cnt; i++)
cout<<ans[i]<<" ";
exit(0);
}
//非边界条件:循环看一看哪些点没有走还可以走
for(int i=1;i<=n;i++){
//联通
if(arr[x][i]==1){
//1.记录当前点
ans[cnt]=i;
//2.删除走过的边
arr[i][x]=arr[x][i]=0;
//3.计数
sum++;
//递归
dfs(i, cnt+1);
//回溯:删除的边还原,计数的数删除
arr[i][x]=arr[x][i]=1;
sum--;
}
}
}
int main(){
//1.输入
cin>>n>>m;
//2.构建无向图邻接矩阵
for(int i=1;i<=m;i++){
int a,b;
cin>>a>>b;
dot[a]++, dot[b]++;
arr[a][b]=arr[b][a]=1;
}
//统计
int k=0;
start[1]=1;
//3.记录每个结点连接边数量
for(int i=1;i<=n;i++){
if(dot[i]%2==1){
k++;
start[k]=i;
}
}
//4.判断:1.奇点为0 2.奇点为2并且1是奇点 //搜索
if(k==0 || k==2&&start[1]==1){
ans[1] = start[1];
dfs(start[1], 2);
}else{
cout << "no oula circle";
}
return 0;
}