Cod sursa(job #1231496)

Utilizator PTAdrian64Pop-Tifrea Adrian PTAdrian64 Data 20 septembrie 2014 19:52:18
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <cstdio>
#define n_max 1000010

#define m_max 5000012

#define stn stack_node

#include <vector>

#include <deque>



using namespace std;



struct stack_node{

int inf;
  
stack_node *next;

} *v;

int n,m,d[n_max];

vector <int> Gr[n_max],L;

deque <int> dq;

bool s[n_max];



void add_stn(int x){

stn *c=new stn;

c->inf=x;

c->next=v;

v=c;

}



void pop_stn(){

stn *c=v;

v=v->next;

delete c;

}



void read_gr(){

int x,y;

scanf("%d %d",&n,&m);

while(m--){

scanf("%d %d",&x,&y);

d[x]++;d[y]++;

Gr[x].push_back(y);
Gr[y].push_back(x);

}

}



bool eulerian(){

vector <int> :: iterator it;

int i;

dq.push_back(1);
s[1]=1;
while(!dq.empty()){

i=dq.front();

for(it=Gr[i].begin();it!=Gr[i].end();++it)

if(!s[*it]){

s[*it]=1;

dq.push_back(*it);

}

dq.pop_front();

}

for(i=1;i<=n;i++)

if(s[i]||d[i]%2)
return 0;

return 1;

}


void solve(){

if(!eulerian()){

printf("-1");
return;}

vector <int> :: iterator it;

int c=1,g;

do{

while(!Gr[c].empty()){

g=Gr[c].front();

add_stn(c);

d[c]--;d[g]--;

Gr[c].erase(Gr[c].begin());

for(it = Gr[g].begin();it != Gr[g].end(); ++ it)

if(*it == c){

Gr[g].erase(it);
break;
}

c=g;

}

c=v->inf;

pop_stn();

L.push_back(c);

}
while(v);

for(it = L.begin();it != L.end(); ++ it)
printf("%d ", *it );

}



int main(void){

freopen("ciclueuler.in","r",stdin);

freopen("ciclueuler.out","w",stdout);

read_gr();

solve();


}