Cod sursa(job #2163432)

Utilizator andrei.gramescuAndrei Gramescu andrei.gramescu Data 12 martie 2018 18:13:57
Problema Ciclu Eulerian Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include <cstdio>
#include <stack>
#include <vector>
using namespace std;
#define NMAX 100005
#define MMAX 500005

typedef pair<int, int> ii;
int n, m;
bool viz[NMAX], done[MMAX];
vector<ii> a[NMAX];
vector<int> sol;
stack<int> st;

int main(){

    int i, x, y, aux, rem;
    FILE *fin, *fout;
    fin = fopen("ciclueuler.in", "r");
    fout = fopen("ciclueuler.out", "w");

    fscanf(fin, "%d %d", &n, &m);
    for(i=1; i<=m; i++) {
        fscanf(fin, "%d %d", &x, &y);
        a[x].push_back( ii(y, i) );
        a[y].push_back( ii(x, i) );
    }

    for(i=1; i<=n; i++)
        if((int) a[i].size() % 2) {
            fscanf(fout, "-1");
            return 0;
        }

    st.push(1);
    rem = n;
    while(!st.empty()) {
        x = st.top();

        if(!viz[x]) {
            viz[x] = true;
            rem--;
        }

        if(a[x].size()) {
            y = a[x].back().first;
            aux = a[x].back().second;
            a[x].pop_back();
            if(!done[aux]) {
                done[aux] = true;
                st.push(y);
            }
        }
        else {
            sol.push_back( st.top() );
            st.pop();
        }
    }

    sol.pop_back();
    if(rem) {
        fprintf(fout, "-1");
        return 0;
    }
    else
        for(i=0; i<(int)sol.size(); i++)
            fprintf(fout, "%d ", sol[i]);

    fclose(fin);
    fclose(fout);
    return 0;
}