Pagini recente » Cod sursa (job #150097) | Cod sursa (job #1145850) | Cod sursa (job #1478146) | Cod sursa (job #1059363) | Cod sursa (job #951418)
Cod sursa(job #951418)
#include<fstream>
#include<list>
#include<stack>
#include<bitset>
using namespace std;
const int Nmax = 100001;
ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");
list<int> G[Nmax], output;
stack<int> st;
bitset<Nmax> viz;
int N, M, deg[Nmax], ok = 1;
void DFS(int nod) {
viz[nod] = 1;
for(auto it=G[nod].begin(); it!=G[nod].end(); ++it)
if(!viz[*it])
DFS(*it);
}
void remove_node(int from, int to) {
deg[from]--, deg[to]--;
G[from].pop_front();
for(auto it=G[to].begin(); it!=G[to].end(); ++it)
if(*it == from) {
G[to].erase(it);
break;
}
}
void euler(int node) {
while(1) {
if(G[node].empty() == true)
break;
st.push(node);
int new_node = G[node].front();
remove_node(node, new_node);
node = new_node;
}
}
void make_euler_cycle() {
int node = 1;
do {
euler(node);
node = st.top();
st.pop();
output.push_back(node);
} while(!st.empty());
}
void read_data() {
int to, from;
f >> N >> M;
while(M--) {
f >> to >> from;
G[to].push_back(from);
G[from].push_back(to);
deg[to]++;
deg[from]++;
}
}
bool are_degrees_odd() {
for(int i=1; i<=N; i++)
if(deg[i]%2 == 1)
return false;
return true;
}
bool is_graph_connected() {
DFS(1);
for(int i=1; i<=N; i++)
if(!viz[i])
return false;
return true;
}
int main() {
read_data();
if(is_graph_connected() && are_degrees_odd()) {
make_euler_cycle();
for(auto it=output.begin(); it!=output.end(); ++it)
g << *it << " ";
}
else
g << -1;
f.close();
g.close();
return 0;
}