Cod sursa(job #1615463)

Utilizator feli2felicia iuga feli2 Data 26 februarie 2016 16:36:51
Problema Ciclu Eulerian Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <iostream>
#include <fstream>
#include <vector>

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

vector <int> G[100005];
int i, n, sn[100005], si[100005], poz, nr, c[100], u, v, m;
bool ok;

bool verif()
{
    for(i=1;i<=n;i++)
        if(G[i].size()%2==1)
            return 0;
    return 1;
}

void _erase(int a, int b)
{
    G[a].erase(G[a].begin()+si[poz]);
    for(i=0;i<G[b].size();i++)
    {
        if(G[b][i]==a)
        {
            G[b].erase(G[b].begin()+i);
            return;
        }
    }
}

void euler()
{
    sn[1]=1;
    si[1]=0;
    poz=1;
    while(poz>0)
    {
        if(si[poz]<G[sn[poz]].size())
        {
            sn[poz+1]=G[sn[poz]][si[poz]];
            _erase(sn[poz],G[sn[poz]][si[poz]]);
            si[poz]++;
            poz++;
        }
        else
        {
            fout<<sn[poz]<<" ";
            poz--;
        }
    }
}

int main()
{
    fin>>n>>m;
    for(i=1;i<=m;i++)
    {
        fin>>u>>v;
        G[u].push_back(v);
        G[v].push_back(u);
    }
    ok=verif();
    if(ok)
    {
        euler();
    }
    else
        fout<<-1;
    return 0;
}