Cod sursa(job #1025739)

Utilizator DiaconuDanDiaconu Dan DiaconuDan Data 10 noiembrie 2013 15:24:38
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.03 kb
#include <fstream>
#include <vector>
#include <stack>
#include <algorithm>
#include <queue>

using namespace std;


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


int viz[100008], n, m ;

stack<int>S ;
vector <int> M[100008], ciclu ;

void citire();
int grade_pare() ;
int conex () ;
void rezolvare();
void afisare();

int main()
{
    citire();
    if ( grade_pare() &&  conex()  )
    {
        rezolvare();
        afisare();
    }
    else
        fout << -1 << '\n' ;
    return 0 ;
}


void citire()
{
    int i, x, y;
    fin >> n >> m ;
    for ( i = 1 ; i <= m ; i++)
    {
        fin >> x >> y ;
        M[x].push_back(y);
        M[y].push_back(x);
    }

}

int grade_pare()
{
    int i ;
    for ( i = 1 ; i <= n ; i++)
        if ( M[i].size() % 2 != 0 )
            return 0;
    return 1 ;
}

int conex()
{
    int i, x;
    queue <int> q ;
    q.push(1) ; viz[1] = 1;
    while ( ! q.empty() )
    {
        x = q.front();
        q.pop();
        for ( i = 0 ; i < M[x].size() ; i++)
        {
            if ( viz[M[x][i]] == 0 )
            {
               viz[M[x][i]] = 1 ;
               q.push(M[x][i]) ;
            }
        }
    }
    for ( i = 1 ; i <= n ; i++)
        if ( viz[i] == 0 )
            return 0;
    return 1 ;

}

void rezolvare()
{
    int x,y, j;
    S.push(1) ;
    while ( ! S.empty() )
    {
        x = S.top();
        if ( M[x].size() > 0 )
        {
            y = M[x].back();
            S.push(y);
            M[x].pop_back();
            for ( j = 0 ; j < M[y].size(); j++)
                if ( M[y][j] == x )
                {
                    M[y].erase(M[y].begin() + j );
                    break ;
                }
        }
        else
        {
            ciclu.push_back(x);
            S.pop();
        }
    }
}

void afisare()
{
    int i ;
    for ( i = 0 ; i < ciclu.size() - 1 ; i++ )
        fout << ciclu[i] << " " ;
    fout << '\n' ;
}