一笔画问题

描述

 

如果一个图存在一笔画,则一笔画的路径叫做欧拉路,如果最后又回到起点,那这个路径叫做欧拉回路。
根据一笔画的两个定理,如果寻找欧拉回路,对任意一个点执行深度优先遍历;找欧拉路,则对一个奇点执行dfs,时间复杂度为O(m+n),m为边数,n是点数。

 

输入描述

 

第一行n,m,有n个点,m条边,以下m行描述每条边连接的两点。

 

输出描述

 

欧拉路或欧拉回路,输出一条路径即可。

 

用例输入 1 

5 5
1 2
2 3
3 4
4 5
5 1

用例输出 1 

1 5 4 3 2 1
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e3+10,inf = 0x3f3f3f3f;
int g[N][N],d[N];
int n,m;
int pre[N],k;
void dfs(int x)
{
    for(int i=1;i<=n;i++)
    {
        if(g[x][i]) //有边没走过 
        {
            g[x][i] = g[i][x] = 0; //删边 
            
            dfs(i);
        }
    }
    pre[++k] = x; //记录路径 
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        int x,y;cin>>x>>y;
        g[x][y] = g[y][x] = 1;
        d[x]++;d[y]++; //记录每个点的度 
    }
    int st = 1;
    for(int i=1;i<=n;i++)
    {
        if(d[i]%2==1)st = i; //找奇点 
    }
    dfs(st);
    for(int i=1;i<=k;i++)
    {
        cout<<pre[i];
        if(i!=k)cout<<" ";
    }
     return 0;
}

 

posted @ 2023-04-26 19:58  CRt0729  阅读(120)  评论(0)    收藏  举报