Cod sursa(job #1006422)

Utilizator Cristy94Buleandra Cristian Cristy94 Data 6 octombrie 2013 23:43:19
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.9 kb
#include <cstdio>
#include <vector>
#include <stack>

#define Mmax 500001

using namespace std;
 
stack <int> c; //stiva cu noduri
int ce[Mmax]; //solutia
vector<int> a[100001]; //muchiile
int k;
 
void ciclu(int nr){   
    int x = nr, z; //salvam nodul de start
 
    do   
        if(a[x].size()){ //daca nodul are vecin
            c.push(a[x][0]); //adaugam nodul in stiva pentru  (incercam sa formam un nou ciclu din el)                          
            z = a[x][0];                
            a[z].erase(find(a[z].begin(), a[z].end(), x)); //stergem muchia de la z la x
            a[x].erase(a[x].begin()); //stergem muchia de la x la z
            x = z; //ne mutam in nodul z
        }
                     
    while (x!=nr); //cat timp nu am ajuns in nodul de inceput (!ciclu)
}
 
int main(){ 
     
    freopen("ciclueuler.in","r",stdin);
    //freopen("ciclueuler.out","w",stdout);
     
    int N, M;
    scanf("%d%d",&N,&M);
     
    for (int i = 1; i <= M; i++){   
        int x, y;
        scanf("%d%d",&x,&y);        
        a[x].push_back(y);
        a[y].push_back(x); //graf neorientat
    }   
     
    for (int i = 1; i <= N; i++)
        if (a[i].size() % 2){ //daca un nod are gr impar
            printf("-1");  //nu este eulerian
            return 0; 
        }
         
    c.push(1);
     
    do { 
            if (a[c.top()].size() > 0)   //daca nodul curent are muchii nefolosite
                ciclu(c.top()); //putem forma un nou ciclu
            
            ce[++k]=c.top(); //adaugam nodul curent la sol, trecem la nod anterior
            c.pop();
    }     
    while (c.size() != 1);
             
    if(k != M){ //daca nu am folosit toate muchiile
        printf("-1"); return 0; //nu este eulerian
    }

    for (int i = 1; i <= k; i++) //afisam nodurile din ciclu
        printf("%d ",ce[i]);
    
    return 0;
}