Pagini recente » Cod sursa (job #1688762) | Cod sursa (job #910082) | Cod sursa (job #9391) | Cod sursa (job #560062) | Cod sursa (job #877427)
Cod sursa(job #877427)
#include <iostream>
#include <fstream>
#include <vector>
#include <bitset>
#include <stack>
#include <list>
using namespace std;
#define Nmax 100002
list <int> Graf[Nmax], lista;
vector <int> grad(Nmax);
stack <int> st;
bitset <Nmax> viz;
int N, M;
void citire(){
ifstream f("ciclueuler.in");
f >> N >> M;
int a, b;
for(; M; M--){
f >> a >> b;
Graf[a].push_back(b);
Graf[b].push_back(a);
grad[a]++;
grad[b]++;
}
f.close();
}
void df(int nod){
viz[nod] = 1;
for(list <int> ::iterator it = Graf[nod].begin(); it != Graf[nod].end(); ++it)
if(!viz[*it])
df(*it);
}
int verifica(){
for(int i = 1; i <= N; ++i)
if(!viz[i] || grad[i] % 2)
return 0;
return 1;
}
void sterge(int a, int b){
grad[a]--;
grad[b]--;
Graf[a].pop_front();
for(list <int> ::iterator it = Graf[b].begin(); it != Graf[b].end(); ++it)
if( *it == a ){
Graf[b].erase(it);
break;
}
}
void euler(int nod){
while(!Graf[nod].empty()){
int a = Graf[nod].front();
st.push(nod);
sterge(nod, a);
nod = a;
}
}
void rezolva(){
ofstream g("ciclueuler.out");
int nod = 1;
if(!verifica())
g << -1 << "\n";
else{
do{
euler(nod);
nod = st.top();
st.pop();
lista.push_back(nod);
}while(!st.empty());
for(list <int> ::reverse_iterator it = lista.rbegin(); it != lista.rend(); ++it)
g << *it << " ";
g << "\n";
}
g.close();
}
int main(){
citire();
df(1);
rezolva();
return 0;
}