Cod sursa(job #1556601)

Utilizator PTAdrian64Pop-Tifrea Adrian PTAdrian64 Data 25 decembrie 2015 14:00:53
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <cstdio>
#include <list>
#define nmax 100005
#include <stack>
#include <queue>

using namespace std;

int N,M,d[nmax];
bool viz[nmax];
list <int> G[nmax],R;
stack <int> S;
queue <int> Q;

void read(){
    scanf("%d %d ",&N,&M);
    int x,y;
    while(M--){
        scanf("%d %d ",&x,&y);
        G[x].push_back(y);d[x]++;
        G[y].push_back(x);d[y]++;
    }
}
void BFS(){
    viz[1] = true;
    int x;
    Q.push(1);
    while(!Q.empty()){
        x = Q.front();
        Q.pop();
        for(list <int> :: iterator it = G[x].begin();it != G[x].end();++it)
        if(viz[*it] == false){
            Q.push(*it);
            viz[*it] = true;
        }
    }
}
void Rezolvare(){
    int i,j;
    BFS();
    for(i = 1;i <= N;++i)
    //if(viz[i]==false || d[i]%2==1){printf("-1\n");return;}
    i = 1;
    do{
        while(!G[i].empty()){
            j = G[i].front();
            G[i].pop_front();
            for(list <int> :: iterator it = G[j].begin();it != G[j].end();++it)
            if(*it == i){
                G[j].erase(it);
                break;
            }
            S.push(i);
            i = j;
        }
        i = S.top();
        S.pop();
        R.push_back(i);
    }while(!S.empty());
    for(list <int> :: iterator it = R.begin();it != R.end();++it)printf("%d ",*it);
    printf("\n");
}
int main(){
    freopen("ciclueuler.in","r",stdin);
    freopen("ciclueuler.out","w",stdout);
    read();
    Rezolvare();
    return 0;
}