欧拉回路 USACO 骑马修栅栏

版权声明:未经本蒟蒻同意,请勿转载本蒻博客 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;
}

猜你喜欢

转载自blog.csdn.net/wddwjlss/article/details/81810556