Cod sursa(job #1264104)

Utilizator Laura.miLaura Mitrache Laura.mi Data 15 noiembrie 2014 15:32:12
Problema Ciclu Eulerian Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include <cassert>
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

vector <int> L[500005];
int n,m;
int x,y;
int q[500005];
int grad[500005];
int viz[500005];
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)
{
    int i;
    viz[x] = 1;
   // cout<<x<<"\n";
    for(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)
{
    while(L[k].size()>0)
    {
        int i,j;
        i = L[k][0];

        for(j=0;j<L[k].size() && L[k][j]!=i ;j++);
        swap(L[k][j],L[k][L[k].size()-1]);
        L[k].pop_back();

        for(j=0;j<L[i].size() && L[i][j]!=k ;j++);
        swap(L[i][j],L[i][L[i].size()-1]);
        L[i].pop_back();

       // L[i].erase(find(L[i].begin(),L[i].end(),k));
        Euler(i);
    }
    q[++ul] = k;
}

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


    return 0;
}