骑马修栅栏 题型:最短路 ->欧拉路径模板题目

90 阅读1分钟

1124. 骑马修栅栏 - AcWing题库

求欧拉回路的模板 image.png 求最小字典序的方法 image.png

先遍历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;
}

image.png