Cod sursa(job #1623039)

Utilizator feli2felicia iuga feli2 Data 1 martie 2016 16:45:22
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.82 kb
#include <iostream>
#include <fstream>
#include <stack>
#include <vector>

using namespace std;

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

stack <int> S, rez;
vector <int> G[100005];
bool viz[100005];
int c[100005], n, m, nr, rang[100005];

void bfs()
{
    int p, u;
    p=1;
    u=1;
    viz[1]=1;
    c[1]=1;
    while(p<=u)
    {
        int node=c[p];
        p++;
        for(unsigned int i=0;i<G[node].size();i++)
        {
            if(!viz[G[node][i]])
            {
                u++;
                c[u]=G[node][i];
                viz[G[node][i]]=1;
            }
        }
    }
}

bool verif()
{
    bfs();
    for(int i=1;i<=n;i++)
    {
        if(rang[i]%2!=0)
            return 0;
        if(!viz[i])
            return 0;
    }
    return 1;
}

void sterge(int v1, int v2)
{
    G[v1].erase(G[v1].begin());
    for(unsigned int i=0;i<G[v2].size();i++)
    {
        if(G[v2][i]==v1)
        {
            G[v2].erase(G[v2].begin()+i);
            return;
        }
    }
}

int main()
{
    fin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        int u, v;
        fin>>u>>v;
        G[u].push_back(v);
        rang[u]++;
        G[v].push_back(u);
        rang[v]++;

    }
    if(verif())
    {
        S.push(1);
        while(!S.empty())
        {
            int v1=S.top();
            if(G[v1].size())
            {
                int v2=G[v1][0];
                sterge(v1,v2);
                S.push(v2);
            }
            else
            {
                rez.push(v1);
                S.pop();
            }
        }
        rez.pop();
        while(!rez.empty())
        {
            fout<<rez.top()<<" ";
            rez.pop();
        }
    }
    else
        fout<<-1;
    return 0;
}