Pagini recente » Cod sursa (job #858724) | Cod sursa (job #1812062) | Cod sursa (job #764285) | Cod sursa (job #539894) | Cod sursa (job #3344012)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");
const int nmax=1e5, mmax=5e5;
int n, m;
int ordine[nmax+1];
bool visited[nmax+1];
vector<pair<int,int>> G[nmax+1];
bool used[mmax];
queue<int> coada;
stack<int> stiva;
vector<int> ciclu;
bool conex()
{
coada.push(1);
int t;
while(!coada.empty())
{
t=coada.front();
coada.pop();
visited[t]=true;
for(pair<int,int> x: G[t])
if(!visited[x.first])
coada.push(x.first);
}
bool ans=1;
for(int i=1; i<=n; i++)
ans&=visited[i];
return ans;
}
bool ordine_pare()
{
bool ans=1;
for(int i=1; i<=n; i++)
ans&=(ordine[i]%2==0);
return ans;
}
void find_cycle()
{
stiva.push(1);
int t;
while(!stiva.empty())
{
t=stiva.top();
while(!G[t].empty() && used[G[t].back().second])
G[t].pop_back();
if(!G[t].empty())
{
pair<int, int> muchie = G[t].back();
G[t].pop_back();
used[muchie.second]=true;
stiva.push(muchie.first);
}
else
{
stiva.pop();
ciclu.push_back(t);
}
}
}
int main()
{
fin >> n >> m;
int a, b;
for(int i=0; i<m; i++)
{
fin >> a >> b;
G[a].push_back({b,i});
G[b].push_back({a,i});
ordine[a]++;
ordine[b]++;
}
if(!conex() || !ordine_pare())
{
fout << -1;
return 0;
}
find_cycle();
ciclu.pop_back();
for(int x: ciclu)
fout << x << ' ';
return 0;
}