Cod sursa(job #1438352)

Utilizator eneandradaEne Oana-Andrada eneandrada Data 19 mai 2015 18:32:38
Problema Ciclu Eulerian Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <bitset>
#include <stack>

using namespace std;

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

#define MAX_N 100005
#define MAX_M 500005

vector <int> G[MAX_N];
bitset <MAX_N> viz;
int ciclu_eulerian[MAX_M];
int dim = 0;

void dfs(int nod)
{
    stack <int> S;

    S.push(nod);
    while(S.size())
    {
        int top = S.top();
        S.pop();
        viz[top] = 1;
        for(int i = 0; i < G[top].size(); i++)
        {
            if(viz[G[top][i]] == 0)
                S.push(G[top][i]);
        }
    }
}

void euler(int nod)
{
    while(!G[nod].empty())
    {
        int u = G[nod].back();
        G[nod].pop_back();
        for(vector<int>::iterator it = G[u].begin(); it != G[u].end(); it++)
            if(*it == nod)
               { G[u].erase(it); break; }
        euler(u);

        ciclu_eulerian[++dim] = nod;
    }
}

int main()
{
    int i,N,M,x,y;
    int ok1 = 1, ok2 = 1;

    f>>N>>M;
    for(i = 1; i <= M; i++)
    {
        f>>x>>y;
        G[x].push_back(y);
        G[y].push_back(x);
    }

    dfs(1);

    for(i = 1; i <= N; i++)
        if(viz[i] == 0)
            { ok1 = 0; break; } // nu e conex
    if(ok1 != 0)
    {
        for(i = 1; i <= N; i++)
            if(G[i].size()%2 != 0)
                { ok2 = 0; break; } //nu toate nodurile au grad par
    }
    if(ok1 !=0 && ok2 !=0)
    {
        euler(1);
        for(i = 1; i <= dim; i++)
            g<<ciclu_eulerian[i]<<" ";
    }
    else
        g<<-1;
    return 0;
}