Cod sursa(job #1649003)

Utilizator justsomedudePalade Thomas-Emanuel justsomedude Data 11 martie 2016 12:15:49
Problema Ciclu Eulerian Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.78 kb
#include<iostream>
#include<fstream>
#include<vector>
#include<stack>
#define Nmax 100007

using namespace std;

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

stack <int> q;
vector <int> L[Nmax];

bool viz[Nmax];
int N, M, d[Nmax];

void Citire()
{
    int i, j, x, y;
    fin >> N >> M;
    for (i=1; i<=M; i++)
    {
        fin >> x >> y;
        L[x].push_back(y);
        L[y].push_back(x);
        d[x]++; d[y]++;
    }
}

int Grade_pare()
{
    int i;
    for (i=1; i<=N; i++)
      if (d[i] % 2 == 1)
        return 0;
    return 1;
}

void DFS(int k)
{
    int i;
    viz[k] = 1;

    for (int j=0; j<L[k].size(); j++)
    {
       i = L[k][j];
       if (!viz[i]) DFS(i);
    }
}

int Este_conex()
{
    DFS(1);
    for (int i=1; i<=N; i++)
        if (!viz[i]) return 0;
    return 1;
}

int Este_eulerian()
{
    if (!Grade_pare()) return 0;
    if (!Este_conex()) return 0;
    return 1;
}

void Sterge_muchie(int i, int k)
{
    for (int j=0; j<L[i].size(); j++)
    {
        if (L[i][j] == k)
        {
            L[i][j] = L[i][L[i].size()-1];
            L[i].pop_back();
            return;
        }
    }
}

void Euler(int k)
{
    int i;

    while (L[k].size() > 0)
  {
     i = L[k][0];
     /// Sterg muchia (k,i)
     L[k][0] = L[k][L[k].size()-1];
     L[k].pop_back();
     /// Sterg muchia (i,k)
     Sterge_muchie(i, k);
     Euler(i);
  }
    q.push(k);
}

int main ()
{
    Citire();
    if (!Este_eulerian()) fout << "-1\n";
    else
    {
        Euler(1);
        q.pop();
        while(!q.empty())
        {
            fout << q.top() << " ";
            q.pop();
        }
    }
   fout << "\n";
   fin.close();
   fout.close();
   return 0;
}