Cod sursa(job #1529348)

Utilizator serbanSlincu Serban serban Data 20 noiembrie 2015 19:57:35
Problema Ciclu Eulerian Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 2.04 kb
#include <bits/stdc++.h>

using namespace std;

vector< pair<int, int> > L[100005];
int l[100005];
int r[100005];
bool v[100005];
bool M[500005];

deque<int> q;

bool viz[100005];
void dfs(int node) {
    viz[node] = true;
    for(int i = 0; i < L[node].size(); i ++) {
        if(!M[L[node][i].second] && !viz[L[node][i].first]) {
            dfs(L[node][i].first);
        }
    }
}

int n;
bool pot(int a, int b) {
    for(int i = 1; i <= n; i ++)
        viz[i] = false;
    dfs(a);
    bool ok = true;
    for(int i = 1; i <= n; i ++) {
        if(r[i] < L[i].size())
            ok &= viz[i];
    }
    if(ok) {
        for(int i = 1; i <= n; i ++)
            viz[i] = false;
        dfs(b);
        for(int i = 1; i <= n; i ++) {
            if(r[i] < L[i].size())
                ok &= viz[i];
        }
        if(ok)
            return true;
    }
    return false;
}

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

int k, m;
void din(int node) {
    if(k == m)
        return ;
    k ++;
    g << node << " ";
    while(l[node]) {
        if(!M[L[node][l[node] - 1].second])
            if(pot(node, L[node][l[node] - 1].first)) {
                r[node] ++;
                r[L[node][l[node] - 1].first] ++;
                M[L[node][l[node] - 1].second] = true;
                din(L[node][l[node] - 1].first);
                return ;
            }
        l[node] --;
    }
}
int main()
{
    int x, y;
    f >> n >> m;
    for(int i = 1; i <= m; i ++) {
        f >> x >> y;
        L[x].push_back(make_pair(y, i));
        L[y].push_back(make_pair(x, i));
    }
    bool ok = true;
    for(int i = 1; i <= n; i ++) {
        l[i] = L[i].size();
        if(l[i] & 1)
            ok = false;
    }
    if(!ok) {
        g << "-1\n";
        return 0;
    }
    //verific conexitate
    dfs(1);
    for(int i = 1; i <= n; i ++)
        if(!viz[i]) ok = false;
    if(!ok) {
        g << "-1\n";
        return 0;
    }

    din(1);
    g << "\n";
    return 0;
}