Cod sursa(job #1383092)

Utilizator mariusadamMarius Adam mariusadam Data 9 martie 2015 21:27:27
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include <fstream>
#include <list>
#include <vector>
#define n_max 100001

using namespace std;

ifstream r("ciclueuler.in");
ofstream w("ciclueuler.out");

vector <int> G[n_max],sol;
list <int> L;
int n,m;

bool eulerian() {
    for (int i=1; i<=n;i++)
        if (G[i].size() % 2!=0)
            return false;
    return true;
}

void read() {
    int i,j,k;
    r>>n>>m;
    for (k=1; k<=m; k++) {
        r>>i>>j;
        G[i].push_back(j);
        G[j].push_back(i);
    }
}

void ciclu(int x) {
    int nod,y;
    L.push_back(x);
    while (!L.empty()) {
        nod=L.back();
        if (!G[nod].empty()) {
            y=G[nod].back();
            L.push_back(y);
            G[nod].pop_back();
            for (vector <int>::iterator it=G[y].begin(); it!=G[y].end();it++)
                if (*it==nod) {
                    G[y].erase(it);
                    break;
                }
        }
        else {
            sol.push_back(nod);
            L.pop_back();
        }
    }
}

int main() {
    read();
    if (eulerian()) {
        ciclu(1);
        for (int i=0; i<sol.size(); i++) //== for (vector <int>::iterator it=sol.begin(); it!=sol.end(); it++)
              w<<sol[i]<<" ";            //==            w<<*it<<" ";
    }
    else
        w<<-1;
    r.close();
    w.close();
    return 0;
}