Pagini recente » Cod sursa (job #1037950) | Cod sursa (job #5546) | Cod sursa (job #3201153) | Cod sursa (job #2470604) | Cod sursa (job #1165155)
#include <fstream>
#include <vector>
#include <stack>
#include <queue>
using namespace std;
const int MAX_N = 100002;
const int MAX_M = 500002;
int N, M;
vector < int > sol;
vector < pair < int, int > > v[MAX_N];
queue < int > Q;
stack < int > st;
bool out[MAX_M], m[MAX_N];
bool EulerianGraph() {
for(int i = 1; i <= N; ++i)
if(v[i].size() % 2)
return 0;
m[1] = 1;
Q.push(1);
int cnt = 1;
while(!Q.empty()) {
int x = Q.front();
Q.pop();
for(int i = 0; i < (int) v[x].size(); ++i) {
int y = v[x][i].first;
if(!m[y]) {
m[y] = 1;
Q.push(y);
++cnt;
}
}
}
if(cnt < N)
return 0;
return 1;
}
void Euler() {
st.push(1);
while(!st.empty()) {
int x = st.top();
if(v[x].size() > 0) {
int y = v[x][v[x].size() - 1].first, ind = v[x][v[x].size() - 1].second;
if(out[ind] == 0) {
out[ind] = 1;
st.push(y);
}
v[x].pop_back();
}
else {
sol.push_back(x);
st.pop();
}
}
}
int main() {
ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");
f >> N >> M;
for(int i = 1, x, y; i <= M; ++i) {
f >> x >> y;
v[x].push_back(make_pair(y, i));
v[y].push_back(make_pair(x, i));
}
if(EulerianGraph()) {
Euler();
for(int i = 0; i < sol.size() - 1; ++i)
g << sol[i] << " ";
g << "\n";
}
else g << -1 << "\n";
f.close();
g.close();
return 0;
}