Cod sursa(job #1264178)

Utilizator Tester100Tester Tester100 Data 15 noiembrie 2014 16:23:06
Problema Ciclu Eulerian Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include <cassert>
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
vector <int> L[100005];
int n,m;
int x,y;
int q[500005];
int grad[100005];
int viz[100005];
ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");
int ul;
void Citire()
{
    f>>n>>m;
    for(int i=1;i<=m;i++)
     {
         f>>x>>y;
         L[x].push_back(y);
         L[y].push_back(x);
         grad[x]++;
         grad[y]++;
     }
}


void DFS(int x)
{
    viz[x] = 1;
    for(unsigned i=0;i<L[x].size();i++)
        if(viz[L[x][i]]==0)
                DFS(L[x][i]);
}

int Grad_si_Conex()
{
    int i;
    for(i=1;i<=n;i++)
    {
        if(grad[i]%2!=0) return 0;
        if(viz[i]==0) return 0;
    }
    return 1;
}

void Euler(int k)
{
    assert(1<= k && k<=n);
    while(L[k].size()>0)
    {
        int i;
        i = L[k][L[k].size()-1];
        L[k].pop_back();
        assert(find(L[i].begin(),L[i].end(),k)!=L[i].end());
        assert(L[i].size()>0);
        L[i].erase(find(L[i].begin(),L[i].end(),k));
        Euler(i);
    }
    q[++ul] = k;
    assert(ul<=m+1);
}

void Afisare()
{
    int i;
    for(i=1;i<=ul;i++)
        g<<q[i]<<" ";
}
int main()
{
   Citire();
   DFS(1);
   if(Grad_si_Conex()==0)
    {
        g<<"-1\n";
       return 0;
    }
    Euler(1);
    Afisare();


    return 0;
}