Cod sursa(job #954787)

Utilizator RamaStanciu Mara Rama Data 30 mai 2013 00:50:10
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <fstream>
#include <vector>
#include <iostream>
#include <list>
#define MAX 100001
using namespace std;

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

vector < int > E[MAX],solution;
list < int > stack;

int n,m,mark[MAX],x,y;

void read()
{
    f>>n>>m;
    for(int i=0;i<m;i++)
    {
        f>>x>>y;
        E[x].push_back(y);
        E[y].push_back(x);
    }
}
void print()
{
    for(int i=0;i<solution.size();i++)
            g<<solution[i]<<' ';
}
int euler()
{
    int i;
    for(i=1;i<=n;i++)
        if((E[i].size())%2==1) return 0;

    return 1;
}
void solve()
{
    int i,j,node,k=1;
    if(!euler()) g<<-1;
        else
    {
        stack.push_back(1);
        while(!stack.empty())
        {
            node=stack.front();

            if(!E[node].empty())
            {
                x=E[node][0];
                stack.push_front(x);
                E[node][0]=E[node][E[node].size()-1];
                E[node].pop_back();
                for(i=0;i<E[x].size();i++)
                    if(E[x][i]==node)
                    {
                        E[x][i]=E[x][E[x].size()-1];
                        E[x].pop_back();
                        break;
                    }
            }
            else {
                    if(k<=m) {solution.push_back(node); k++;}
                    stack.pop_front();
                 }
        }
    }
}

int main()
{
    read();
    solve();
    print();
}