Skip to content

【模板】欧拉路径(有向图输出字典序最小) ​

思路:

  • 坑点:字典序最大反过来找不会是字典序最小
  • 欧拉路径是逆序输出的,先遍历的点在数组中位置越后,逆序后就越前
  • 只需要按照当前字典序最小的点先走即可,逆序输出即为字典序最小
cpp
int n,m;
vector<int> adj[N];
int del[N],din[N],dout[N],ans[M],cnt;
void dfs(int u){
    for(int i=del[u];i<adj[u].size();i=del[u]){
        del[u]=i+1;
        dfs(adj[u][i]);
        ans[++cnt]=adj[u][i];
    }
}
void solve(){
    cin>>n>>m;
    while(m--){
        int u,v;
        cin>>u>>v;
        dout[u]++,din[v]++;
        adj[u].push_back(v);
    }
    for(int i=1;i<=n;i++)sort(adj[i].begin(),adj[i].end());
    bool in=0,out=0;
    int start=1;
    for(int i=1;i<=n;i++){
        if(din[i]!=dout[i]){
            if(din[i]==dout[i]+1){
                if(in){
                    cout<<"No\n";
                    return;
                }
                in=1;
            }
            else if(dout[i]==din[i]+1){
                if(out){
                    cout<<"No\n";
                    return;
                }
                out=1;
                start=i;
            }
            else{
                cout<<"No\n";
                return;
            }
        }
    }
    if(in^out){
        cout<<"No\n";
        return;
    }
    dfs(start);
    ans[++cnt]=start;
    for(int i=cnt;i;i--)cout<<ans[i]<<" ";
}