Cod sursa(job #899627)

Utilizator deea101Andreea deea101 Data 28 februarie 2013 15:26:38
Problema Ciclu Eulerian Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include <fstream>
#include <vector>
#include <list>
#define INF (1<<30)-1
#define nmax 50001
using namespace std;
ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");
vector < int > v[nmax],sol;
list < int > stiva;
int n,viz[nmax];

int euler()
{
    int i;
    for(i=1;i<=n;i++)
        if(v[i].size()%2==1) return 0;

    return 1;
}
int main()
{
    f>>n;
    int i,j,m,x,y,nod;
    f>>m;
    for(i=0;i<m;i++)
    {
        f>>x>>y;
        v[x].push_back(y);
        v[y].push_back(x);
    }

    if(!euler())
        g<<-1;
    else
    {
        stiva.push_back(1);
        while(!stiva.empty())
        {
            nod=stiva.front();

            if(v[nod].size())
            {
                x=v[nod][0];
                stiva.push_front(x);
                for(i=0;i<v[x].size();i++)
                    if(v[x][i]==nod)
                    {
                        v[x][i]=v[x][v[x].size()-1];
                        v[x].pop_back();
                        break;
                    }
                v[nod][0]=v[nod][v[nod].size()-1];
                v[nod].pop_back();
            }
            else {
                    if(sol.empty() || nod!=sol[0]) sol.push_back(nod);
                    stiva.pop_front();
                 }

        }
        for(i=0;i<sol.size();i++)
            g<<sol[i]<<' ';
    }
}