Cod sursa(job #1243036)

Utilizator armandpredaPreda Armand armandpreda Data 15 octombrie 2014 15:43:18
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
#include <fstream>
#include <vector>
#include <stack>

using namespace std;

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

const int MAX=100005;
vector <int> lista[MAX];
vector <pair <int,int> > muc;
stack <int> s;
vector <int> sol;
int n,m,grad[MAX];
bool viz[MAX];

void dfs(int nod);
void ciclu();
int main()
{
    int i,x,y;
    fin>>n>>m;
    for(i=0;i<m;++i)
    {
        fin>>x>>y;
        muc.push_back(make_pair(x,y));
        lista[x].push_back(i);
        lista[y].push_back(i);
        grad[x]++;
        grad[y]++;
    }
    dfs(1);
    for(i=1;i<=n;++i)
        if(grad[i]&1 or !viz[i])
        {
            fout<<-1<<'\n';
            return 0;
        }
    ciclu();
    for(i=0;i<sol.size()-1;++i)
        fout<<sol[i]<<' ';
    return 0;
}
void dfs(int nod)
{
    viz[nod]=1;
    for(int i=0;i<lista[nod].size();++i)
    {
        int next=muc[lista[nod][i]].first;
        if(nod==next)
            next=muc[lista[nod][i]].second;
        if(!viz[next])
            dfs(next);
    }
}
void ciclu()
{
    int nod=1;
    s.push(nod);
    while(!s.empty())
    {
        nod=s.top();
        if(lista[nod].size())
        {
            int i=lista[nod].back();
            lista[nod].pop_back();
            int next=muc[i].first;
            if(nod==next)
                next=muc[i].second;
            muc[i].first=muc[i].second=0;
            if(next!=0)
                s.push(next);
        }
        else
        {
            sol.push_back(nod);
            s.pop();
        }
    }
}