Cod sursa(job #1231491)

Utilizator PTAdrian64Pop-Tifrea Adrian PTAdrian64 Data 20 septembrie 2014 19:44:49
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 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();

}