Pagini recente » Cod sursa (job #1709603) | Cod sursa (job #1106131) | Cod sursa (job #983053) | Cod sursa (job #978339) | Cod sursa (job #288813)
Cod sursa(job #288813)
using namespace std;
#include <cstdio>
#include <list>
#define Nmax 100010
list <int> S, L[Nmax], Sol;
list <int>::iterator it;
int grad[Nmax], x, y, n, m, i, nod, fiu;
void sterge(int x, int y){
L[x].pop_front();
list <int>::iterator it;
for(it = L[y].begin() ; it != L[y].end(); it++)
if( *it == x ){
L[y].erase(it);
break;
}
}
void parc(int nod){
int v = nod;
S.push_back(v);
do{
fiu = L[v].front();
if(v != nod) S.push_back(v);
sterge(v, fiu);
grad[v]--; grad[fiu]--;
v = fiu;
}while(v != nod);
}
void euler(){
Sol.push_back(1);
list <int>::iterator it, it2, it3;
int nr = 1;
for(it = Sol.begin(); it != Sol.end();){
if(grad[*it]){
parc(*it);
it2 = it;
it3 = it;
it2++;
if(nr != 1)
S.push_back(*it);
Sol.insert(it2, S.begin(), S.end());
it3 = it;
it3++;
Sol.erase(it);
it = it3;
S.clear();
nr++;
}
if( it != Sol.end() && !grad[*it] )
it++;
}
}
int BFS(int x){
int q[Nmax], p = 1, u = 1;
char viz[Nmax];
memset(viz, 0, sizeof(viz));
q[1] = x;
for(; p <= u; p++){
nod = q[p];
for(it = L[nod].begin() ; it != L[nod].end(); it++){
fiu = *it;
if( !viz[fiu] ){
viz[fiu] = 1;
q[++u] = fiu;
}
}
}
for(i = 1; i <= n; i++)
if( !viz[i] && grad[i] )
return 0;
return 1;
}
int verifica(){
for(i = 1; i <= n; i++)
if( (grad[i]&1) == 1 )
return 0;
if( !BFS(1) )
return 0;
return 1;
}
int main(){
FILE *f = fopen("ciclueuler.in", "r");
FILE *g = fopen("ciclueuler.out", "w");
fscanf(f,"%d %d",&n,&m);
for(i=1; i<=m; i++){
fscanf(f,"%d %d",&x, &y);
grad[x]++; grad[y]++;
L[x].push_back(y);
L[y].push_back(x);
}
//vad daca nodurile au gadul par
//vad daca e conex
if( verifica() ){
euler();
for(it = Sol.begin(); it != Sol.end(); it++)
fprintf(g,"%d ",*it);
}
else
fprintf(g,"%d",-1);
fclose(f);
fclose(g);
return 0;
}