Cod sursa(job #2066912)

Utilizator cristii2000cristiiPanaite Cristian cristii2000cristii Data 15 noiembrie 2017 17:51:33
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.73 kb
#include<iostream>
#include<fstream>
#include<vector>
#include<stack>

using namespace std;

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

int n, m, i, j, ok, x, y, nod, vecin;

int d[100005], viz[100005], f[500005];

vector< pair<int, int > > v[100005];
stack<int> s;

void citire()
{
	int x, y;
	in >> n >> m;
    for(i = 1; i <= m; i++){
        in >> x >> y;

        d[x]++;

        d[y]++;

        v[x].push_back( make_pair(y, i) );
        v[y].push_back( make_pair(x, i) );
    }
}

void dfs(int nod)
{
    viz[nod] = 1;
    for(int i = 0; i < v[nod].size(); i++)
	{
        int vecin = v[nod][i].first;
        if(viz[vecin] == 0)
            dfs(vecin);
    }
}

int main()
{
	citire();
    for(i = 1; i <= n; i++){
        if(d[i] != 0)
		{
            x = i;
            dfs(i);
            break;
        }
    }
    for(i = 1; i <= n; i++)
	{
        if(d[i] != 0)
        {
            if(viz[i] == 0 || d[i] % 2 == 1)
            {
                out<<"-1\n";
                return 0;
            }
        }
    }
    s.push(x);

    while(!s.empty())
	{
        nod = s.top();
        if(d[nod] == 0)
        {
            if(ok == 0)
                ok = 1;
            else
                out<< nod <<" ";
            s.pop();
        }

        else
        {
            i = v[nod].size() - 1;

            while(f[v[nod][i].second] == 1)
			{
                v[nod].pop_back();
                i--;
            }

            vecin = v[nod][i].first;
            d[nod]--;
            d[vecin]--;
            f[v[nod][i].second] = 1;
            v[nod].pop_back();
            s.push(vecin);
        }
    }
    return 0;
}