欧拉回路 Hierholzers算法 洛谷2731 骑马修栅栏 网上题解

#include<bits/stdc++.h>
using namespace std;
int n,a,b,h[1025][1025],d[1025],c[1026],cnt;
void xx(int x)
{
    for(int i=1;i<=500;i++)
    if(h[x][i])//表示x-i有路 
    {
        h[x][i]--;//将这条路删除,以免重复 
        h[i][x]--;//同上 
        xx(i);//递归查找 
    }
    c[++cnt]=x;//存值 
}
int main()
{
    cin>>n;//n条相邻的边 
    for(int i=1;i<=n;i++)
    {
        cin>>a>>b;//a,b相邻 
        h[a][b]++;//表示a-b的路的条数 
        h[b][a]++;//同上 
        d[a]++;//算出每个点的度 
        d[b]++;//同上 
    }
    int z=1;//初始值为1,因为可能是欧拉回路,没有奇点,所以可以从任何地方开始搜索 
    for(int i=1;i<=500;i++)//因为最多只有500个顶点 
    if(d[i]%2==1)
    {
        z=i;
        break;//如果这个点的度为奇数的话,那他就是奇点,找到一个就可以结束了 
    }
    xx(z);
    for(int i=n+1;i>=1;i--)//n条边相邻,所以有n+1个点
    //因为是从起点开始,递归查找,所以前面找到的实际上是后面的,所以倒着输出 
    cout<<c[i]<<endl;
} 

 

posted @ 2018-09-03 22:33  StoneXie  阅读(516)  评论(0)    收藏  举报