Cod sursa(job #1323374)

Utilizator CiurezAndreiCiurez Marius-Andrei CiurezAndrei Data 20 ianuarie 2015 22:57:34
Problema Ciclu Eulerian Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include <fstream>
#include <vector>
#include <stack>
#include <bitset>

using namespace std;

ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");

int n, i, m, x, y, k, A[100010];
bitset<500010>v;;
vector< pair <int, int> >L[100010];
stack<int> S;
void dfs(int nod){
    v[nod] = 1;

    for(int i = 1; i < L[nod].size(); i ++)
        if(v[ L[nod][i].first ] == 0)
            dfs( L[nod][i].first );



}

int main()
{
    fin >> n >> m;
    for(i = 1; i <= m; i ++)
    {
        fin >> x >> y;
        L[x].push_back(make_pair(y,i));
        L[y].push_back(make_pair(x,i));
        A[x] ++;
        A[y] ++;
    }

    for(i = 1; i <= n; i ++)
        if(A[i])
        {
            dfs(i);
            k = i;
            break;
        }

    for(i = 1; i <= n;i ++)
        if( ( v[i] == 0 && A[i] ) || A[i] % 2 == 1)
        {
            fout << -1;
            return 0;
        }

    v.reset();
    S.push(k);

    int ok = 1;

    while(!S.empty()){
        k = S.top();
        if (A[k] == 0) {
            if (!ok) {
                fout << k << " ";
            }
            ok = 0;
            S.pop();
            continue;
        }
        while (v[ L[k][ L[k].size() - 1 ].second] == 1)
            L[k].erase(  L[k].end() - 1 );

        v[L[k][ L[k].size() - 1 ].second] = 1;
        S.push(  L[k][ L[k].size() - 1 ].first  );
        A[k]--;
        A[ L[k][ L[k].size() - 1 ].first ]--;
        L[k].erase(  L[k].end()-1 );
    }

    return 0;
}