Cod sursa(job #1244463)

Utilizator PTAdrian64Pop-Tifrea Adrian PTAdrian64 Data 17 octombrie 2014 16:38:26
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.73 kb
#include <cstdio>
#include <stack>
#include <vector>
#define nmv 100020
#include <queue>
using namespace std;

queue <long> sta;
vector <int> graph[nmv];
stack <long> head,tail;
long degree[nmv];
int visitated[nmv];
long n,m;

bool eulerian(){

   sta.push(1);
   visitated[1]=1;
   long p;
   while(!sta.empty()){
       p=sta.front();
       sta.pop();
       for(vector <int> :: iterator it=graph[p].begin();it!=graph[p].end();++it){
           if(!visitated[*it]){
               sta.push(*it);
               visitated[*it]=1;
           }
       }
   }

   for(p=1;p<=n;p++)
    if((!visitated[p])||(degree[p]%2))
       return 0;
   return 1;
}

void euler(){
    long u,v;
    head.push(1);
    vector <int> :: iterator it;
    while(!head.empty()){

        while(degree[head.top()]>0){
             u=head.top();
             v=graph[u].back();
             graph[u].pop_back();degree[u]--;
             for(it=graph[v].begin();(*it)!=u;++it);
             graph[v].erase(it);
             degree[v]--;
             head.push(v);
        }
        while(!head.empty() && degree[head.top()]==0){
             u=head.top();
             head.pop();
             tail.push(u);
        }
    }
   while(!tail.empty()){
       printf("%d ", tail.top());
       tail.pop();
   }
}

void solve(){
   if(eulerian()){
        euler();
     return;
   }
   printf("-1\n");
}

int main()
{

    freopen("ciclueuler.in","r",stdin);
    freopen("ciclueuler.out","w",stdout);

    scanf("%ld %ld ",&n,&m);
    long x,y;
    while(m--){
        scanf("%ld %ld",&x,&y);
        graph[x].push_back(y);degree[x]++;
        graph[y].push_back(x);degree[y]++;
    }
    solve();
    return 0;
}