Cod sursa(job #1461269)

Utilizator petru.cehanCehan Petru petru.cehan Data 15 iulie 2015 12:01:33
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#include <iostream>
#include <fstream>

using namespace std;

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

int N , M , euler [ 100001 ] , lg ;

void Add ( int , int ) ;
void Citire ()
{
    int a , b ;
    fin >> N >> M ;
    while ( M >= 1 )
    {
        fin >> a >> b ;
        Add ( a , b ) ;
        -- M ;
    }
}

struct nod
{
    int info ;
    nod * next ;
} ;

nod * L [ 100001 ] ;

void Add ( int a , int b )
{
    nod * p = new nod ;
    p->info = b ;
    p->next = L [a] ;
    L [a] = p ;

    p = new nod ;
    p->info = a ;
    p->next = L [b] ;
    L [b] = p ;
}

void DeleteNode ( int k , int i )  // Sterge nodul i din lista L [k]
{
    nod * cur , * pred = 0  ;

    if ( L [k]->info == i )
    {
        cur = L [k] ;
        L [k] = L [k]->next ;
        delete cur ;
        return ;
    }

    for ( cur = L [k] ; cur->next != 0 ; pred = cur , cur = cur->next ) ;

    pred->next = cur->next ;
    delete cur ;

}

void Euler ( int k )
{
    int i ;
    nod * p ;
    while ( L [k] != 0 )
    {
        p = L [k] ;
        i = p->info ;
        L [k] = L [k]->next ;
        delete p ;

        DeleteNode ( i , k ) ;
        Euler ( i ) ;
    }

    euler [ ++ lg ] = k ;

}

int main()
{
    Citire () ;
    Euler ( 1 ) ;
    if ( lg == 0 )
          fout << "-1" ;
    for ( int i = 1 ; i <= lg ; ++ i )
            fout << euler [i] << " " ;

    return 0;
}