Pagini recente » Cod sursa (job #156162) | Cod sursa (job #1533327) | Cod sursa (job #587107) | Cod sursa (job #1589400) | Cod sursa (job #2509335)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <stack>
using namespace std;
ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");
struct muc{
int a, b;
bool vi = false;
muc(){}
muc(int a, int b) : a(a), b(b){}
int oti(int x){
if(x == a){
return b;
}else{
return a;
}
}
};
int n, m;
muc muci[500041];
vector<int> gra[100041];
int dad[100041];
bool euler(){
for(int i = 1; i <= n; i++){
if(dad[i] % 2 != 0){
return false;
}
}
return true;
}
queue<int> qu;
bool viz[100041];
int findy(){
for(int i = 1; i <= n; i++){
if(dad[i] != 0){
return i;
}
}
return 1;
}
bool conecz(int st){
qu.push(st);
viz[st] = true;
int x = st;
while(!qu.empty()){
int a = qu.front();
qu.pop();
for(auto mu : gra[a]){
int b = muci[mu].oti(a);
if(!viz[b]){
x++;
viz[b] = true;
qu.push(b);
}
}
}
return (x==n);
}
void solve(){
int st = findy();
if(!euler() || !conecz(st)){
fout << "-1";
}else{
stack<int> oflo;
oflo.push(st);
while(!oflo.empty()){
int a = oflo.top();
if(!gra[a].empty()){
int mu = gra[a].back();
gra[a].pop_back();
if(!muci[mu].vi){
muci[mu].vi = true;
int b = muci[mu].oti(a);
oflo.push(b);
}
}else{
if(oflo.size() > 1){
fout << a << " ";
}
oflo.pop();
}
}
}
}
int main(){
fin >> n >> m;
for(int i = 0; i < m; ++i){
int a, b;
fin >> a >> b;
muci[i] = muc(a, b);
gra[a].push_back(i);
gra[b].push_back(i);
dad[a]++;
dad[b]++;
}
solve();
return 0;
}