Pagini recente » Cod sursa (job #1413639) | Cod sursa (job #1118495) | Cod sursa (job #1763184) | Cod sursa (job #614331) | Cod sursa (job #933345)
Cod sursa(job #933345)
#include <stdio.h>
#include <vector>
#include <stack>
#include <list>
#include <queue>
#include <cstring>
using namespace std;
#define Nmax 100001
vector < list<int> > graf;
list <int>::iterator it, last;
queue <int> coada;
int deg[Nmax], vizitat[Nmax];
int n, m;
void citire(){
int x, y, j;
char cc[100];
scanf("%i %i", &n, &m);
graf.resize(n+1);
fgets(cc, 100, stdin);
for(register int i = 1; i <= m; ++i){
fgets(cc, 100, stdin);
x = y = j = 0;
while(cc[j] != ' ') x = x * 10 + cc[j] - '0', ++j;
++j;
while(cc[j] != '\n') y = y * 10 + cc[j] - '0', ++j;
++deg[x]; ++deg[y];
graf[x].push_back(y);
graf[y].push_back(x);
}
fclose(stdin);
}
void bfs(int v){
int first = v;
coada.push(1);
while(!coada.empty()){
first = coada.front();
coada.pop();
it = graf[first].begin();
last = graf[first].end();
for(; it != last; ++it)
if(!vizitat[*it]) coada.push(*it), vizitat[*it] = 1;
}
}
int conex(){
bfs(1);
for(int i = 1; i <= n; ++i)
if(!vizitat[i]) return 0;
return 1;
}
int eulerian(){
if( !conex() ) return 0;
for(int i = 1; i <= n; ++i)
if(deg[i] % 2 != 0) return 0;
return 1;
}
void sterge(list<int>&l , int v){
for(list<int>::iterator it2 = l.begin(); it2 != l.end(); ++it2)
if(*it2 == v)
l.erase(it2);
}
void euler(int v){
int v1;
while(!graf[v].empty()){
v1 = *graf[v].begin();
graf[v].pop_front();
sterge(graf[v1], v);
euler(v1);
}
printf("%i ", v);
}
void rez(){
int v = eulerian();
if(v == 0) printf("-1\n");
else euler(1);
return;
}
int main(){
freopen("ciclueuler.in", "r", stdin);
freopen("ciclueuler.out", "w", stdout);
citire();
rez();
}