求欧拉回路的模板
求最小字典序的方法
先遍历1号点(编号从1到n),则1号点一定最后被加入欧拉路径。
因为要求我们存字典序较小的,因此我们在爆搜的时候先把小的放入,这样小的就一定在最后面,然后按照从小到大的顺序依次放入,最后输出的时候逆序输出,这样最后逆序输出就是字典序较小的路径。
所以开始时优先搜索序号较小的点。
无向图存欧拉路径
#include<bits/stdc++.h>
using namespace std;
const int N=510;
int g[N][N]; //点
int d[N];
int ans[1100]; //存点,无向边开双倍内存
int n=500,cnt,m;
void dfs(int u)
{
for(int i=1;i<=n;i++)
if(g[u][i]) //如果当前边存在
{
g[u][i]--,g[i][u]--; //删边优化 无向边两边都要删除
dfs(i);
}
ans[++cnt]=u;
}
int main()
{
cin>>m;
while(m--)
{
int a,b;cin>>a>>b;
g[a][b]++,g[b][a]++; //标记一下,表示边存在
d[a]++,d[b]++; //入度++,出度++
}
int start=1;
while(!d[start])++start; //为了防止如果图中不存在奇点,图没有起点
//遍历所有的点,找到第一个奇点作为起点
for(int i=1;i<=500;i++)
{
if(d[i]%2)
{
start=i;
break;
}
}
dfs(start); //从起点开始走
for(int i=cnt;i;i--)cout<<ans[i]<<endl;
return 0;
}