Pagini recente » Borderou de evaluare (job #1035887) | Cod sursa (job #2985176) | Borderou de evaluare (job #106541) | Borderou de evaluare (job #1292856) | Cod sursa (job #1967283)
#include <bits/stdc++.h>
using namespace std;
#define REP(i,a) for (int i = 0; i < a; i++)
#define FOR(i,a,b) for (int i = a; i <= b; i++)
#define ROF(i,a,b) for (int i = a; i >= b; i--)
#define FOREACH(it,x) for (auto it: (x))
#define pb push_back
#define mp make_pair
#define SZ(x) ((int)(x).size())
int n,m;
vector<int> G[100001];
vector<int> Sol;
bool seen[100001];
int grad[100001];
void dfs(int node)
{
seen[node] = 1;
FOREACH(it,G[node]) if (!seen[it]) dfs(it);
}
int main()
{
ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");
fin >> n >> m;
while (m--) {
int x,y;
fin >> x >> y;
G[x].pb(y);
grad[x]++,grad[y]++;
G[y].pb(x);
}
int comp = 0;
FOR(i,1,n) {
if (!seen[i]) dfs(i), comp++;
if (grad[i] % 2 != 0) comp = 2;
if (comp == 2) break;
}
if (comp > 1) {
fout << "-1";
return 0;
}
stack<int> S; S.push(1);
while (!S.empty())
{
int u = S.top();
if (SZ(G[u]))
{
int v = G[u].back(); G[u].pop_back();
FOR(i,0,SZ(G[v])) if (G[v][i] == u) {
G[v].erase(G[v].begin()+i);
break;
}
S.push(v);
continue;
}
Sol.pb(u);
S.pop();
}
Sol.pop_back();
FOREACH(it,Sol) fout << it << " ";
}