201512-4-送货(无向图-最小字典序-欧拉路径模板)

无向图的欧拉路经,并且输出字典序最小的方案。

#include<bits/stdc++.h>
using namespace std;

const int maxn = 1e4+10;
bool vis[maxn][maxn];
vector<int>G[maxn];
int n, m;
int d[maxn];

int main(){
    ios::sync_with_stdio(false);
    cin>>n>>m;
    int u, v;
    for(int i=1; i<=m; i++){
        cin>>u>>v;
        G[u].push_back(v), G[v].push_back(u);
        d[u]++, d[v]++;
    }
    int odd = 0;
    for(int i=1; i<=n; i++) {
        if(d[i]&1) odd++;
        sort(G[i].begin(), G[i].end());
    }
    stack<int> st;
    st.push(1);
    vector<int> ans;
    while(!st.empty()){
        int u = st.top();
        bool flag = false;
        for(int i=0; i<G[u].size(); i++){
            int v = G[u][i];
            if(!vis[u][v]){
                vis[u][v] = vis[v][u] = true;
                flag = true;
                st.push(v);
                break;
            }
        }
        if(!flag){
            ans.push_back(u);
            st.pop();
        }
    }
    if(ans.size() == m+1 &&(odd == 0||(odd == 2 &&(d[1]&1)))){
        int sz = ans.size();
        cout<<ans[sz-1];
        for(int i=sz-2; i>=0; i--){
            cout<<" "<<ans[i];
        }
        cout<<endl;
    }
    else cout<<-1<<endl;

    return 0;
}

原文地址:https://www.cnblogs.com/babydragon/p/11759695.html