Cod sursa(job #968570)

Utilizator mitrutstrutMitrea Andrei Ionut mitrutstrut Data 2 iulie 2013 12:28:16
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 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();
}