Cod sursa(job #1638467)

Utilizator serbanSlincu Serban serban Data 7 martie 2016 23:26:03
Problema Ciclu Eulerian Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.94 kb
#include <fstream>
#include <vector>

using namespace std;

ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");

vector<pair<int, int> > L[100005];
vector<pair<int, int> > mm;
vector<int> ans;
bool vm[500005];

bool viz[3][100005];
int w, n;
void df_deconex(int v) {
    viz[w][v] = true;
    for(int i = 0; i < L[v].size(); i ++) {
        int act = L[v][i].first;
        int muc = L[v][i].second;
        if(!viz[w][act] && !vm[muc])
            df_deconex(act);
    }
}

bool would_deconex(int muc) {
    int x = mm[muc].first;
    int y = mm[muc].second;
    bool ok = true;

    vm[muc] = true;
    w = 1; df_deconex(x);
    w = 2; df_deconex(y);
    int k1 = 0, k2 = 0;
    for(int i = 2; i <= n; i ++)
        if(viz[1][i]) k1 ++;
    for(int i = 1; i <= n; i ++)
        if(viz[2][i]) k2 ++;
    if(k1 != 1 && k2 != 1) {
        for(int i = 1; i <= n; i ++) {
            if(viz[1][i] != viz[2][i]) {
                ok = false;
                break;
            }
        }
    }
    for(int i = 1; i <= n; i ++) viz[1][i] = viz[2][i] = false;
    vm[muc] = false;
    return ok;
}


void df(int v) {
    ans.push_back(v);
    for(int i = 0; i < L[v].size(); i ++) {
        int act = L[v][i].first;
        int muc = L[v][i].second;
        if(!vm[muc] && would_deconex(muc)) {
            vm[muc] = true;
            df(act);
            return ;
        }
    }
}

int main()
{
    int m, x, y; f >> n >> m;
    for(int i = 1; i <= m; i ++) {
        f >> x >> y;  // MULTIGRAF!!!!!!!!!!!!!!!
        L[x].push_back({y, i - 1});
        L[y].push_back({x, i - 1});
        mm.push_back({x, y});
    }
    w = 1; df_deconex(1);
    int i;
    for(i = 1; i <= n; i ++) if(!viz[1][i] || (L[i].size() & 1)) i = n + 2;
    if(i == n + 3) {
        g << "-1\n";
        return 0;
    }
    df(1);
    for(int i = 0; i < ans.size(); i ++) g << ans[i] << " ";
    g << "\n";
    return 0;
}