版权声明:未经本蒟蒻同意,请勿转载本蒻博客 https://blog.csdn.net/wddwjlss/article/details/81810556
题意:给出一个无向图,求欧拉回路(不重复地经过所有边)经过的点的次序。
做法:找出欧拉路的方法就是采用dfs的方式,找到第一个入度为奇数的点开始dfs。对于当前的点,从大到小枚举所有点,找到和它相连的,找到一个之后删除它们之间的连线,并去搜索新的那个点,如果没有找到点和它相连,那么就把这个点加入输出栈。
#include<iostream>
#include<cstdio>
#include<stack>
#include<algorithm>
using namespace std;
stack<int> s;
int n,m;
int g[2000][2000],du[5000];
void dfs(int u)
{
for(int v=1;v<=n;++v)
{
if(g[u][v])
{
g[u][v]--;
g[v][u]--;
dfs(v);
}
}
s.push(u);
}
int main()
{
cin>>m;
for(int i=1;i<=m;++i)
{
int x,y;
cin>>x>>y;
n=max(max(x,y),n);
g[x][y]++;
g[y][x]++;
du[x]++;
du[y]++;
}
int st=1;
for(int i=1;i<=n;++i)
{
if(du[i]%2==1)
{
st=i;
break;
}
}
dfs(st);
while(!s.empty())
{
cout<<s.top()<<endl;
s.pop();
}
return 0;
}