dfs中为什么搜索一进来输出不可以?

P2731 [USACO3.3] 骑马修栅栏 Riding the Fences

ZeePing @ 2024-06-11 20:32:06

#include<bits/stdc++.h>
using namespace std;
int maxx,m;
int g[501][501];  
int dis[501],path[1005];   
int beginn=9999999;
int cnt;
void dfs(int i){
    cout<<i<<endl;  //这里有问题, 为什么都是在下面这个for循环结束后用栈记录。 这里搜索一进来就输出不可以? 
    for(int j=beginn;j<=maxx;j++)
        if(g[i][j]){
            g[i][j]--;
            g[j][i]--;
            dfs(j);
        } 
}
int main(){

    cin>>m;
    for(int i=1;i<=m;i++){
        int x,y;
        cin>>x>>y;
        g[x][y]++;
        g[y][x]++;
        dis[x]++;
        dis[y]++;
        maxx=max(maxx,max(x,y));
        beginn=min(beginn,min(x,y));
    }
    int start=beginn;   
    int sum=0;
    for(int i=beginn;i<=maxx;i++)
        if(dis[i]%2){ 
            start=i;
            break;
        }

    dfs(start);
    return 0;
}

by e_zhe @ 2024-06-13 18:20:57

一上来就输出得到的是 访问顺序,并不是 欧拉路径(回路),以下数据可以帮助解决这个问题。

题目:P7771

3 3

1 3

3 3

3 2

如果使用直接输出,我们会得到1 3 2 3,但由2到3并没有有向边,所以不合法。

使用栈的输出方式会得到1 3 3 2,合法。


|