Cod sursa(job #630662)

Utilizator gramatovici_paulGramatovici Paul gramatovici_paul Data 6 noiembrie 2011 12:21:54
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.95 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

vector<int> muchii[100100];
int leg[1000100],dr[1000100];
char marc[1000100];
int stiv[100100];
bool viz[100100];

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


int main()
{
    int n,m,i,x,y,k,nod,nr;
    in>>n>>m;
    nr=0;
    for(i=1;i<=m;++i)
    {
        in>>x>>y;
        muchii[x].push_back(++nr);
        marc[nr]=0;
        dr[nr]=y;
        leg[nr]=nr+1;
        muchii[y].push_back(++nr);
        marc[nr]=0;
        dr[nr]=x;
        leg[nr]=nr-1;
    }
    for(i=1;i<=n;++i)
    {
        if(muchii[i].size()&1)
        {
            out<<-1<<"\n";
            return 0;
        }
    }
    k=n-1;
    viz[1]=true;
    stiv[0]++;
    stiv[1]=1;
    while(k && stiv[0])
    {
        i=0;
        while(i<muchii[stiv[stiv[0]]].size() && viz[dr[muchii[stiv[stiv[0]]][i]]])
        {
            i++;
        }
        if(i==muchii[stiv[stiv[0]]].size())
        {
           stiv[0]--;
        }
        else
        {
            k--;
            viz[dr[muchii[stiv[stiv[0]]][i]]]=true;
            stiv[stiv[0]+1]=dr[muchii[stiv[stiv[0]]][i]];
            marc[muchii[stiv[stiv[0]]][i]]=1;
            marc[leg[muchii[stiv[stiv[0]]][i]]]=1;
            stiv[0]++;
        }
    }
    if(k)
    {
        out<<-1<<"\n";
        return 0;
    }
    k=m-1;
    nod=1;
    out<<"1";
    while(k)
    {
        i=0;
        while(i<muchii[nod].size() && marc[muchii[nod][i]]!=0)
        {
            i++;
        }
        if(i==muchii[nod].size())
        {
            i=0;
            while(i<muchii[nod].size() && marc[muchii[nod][i]]!=1)
            {
                i++;
            }
        }
        out<<" "<<dr[muchii[nod][i]];
        marc[muchii[nod][i]]=2;
        marc[leg[muchii[nod][i]]]=2;
        nod=dr[muchii[nod][i]];
        k--;
    }
    out<<"\n";
    return 0;
}