Pagini recente » Cod sursa (job #77646) | Cod sursa (job #194134) | Cod sursa (job #2351796) | Cod sursa (job #1540359) | Cod sursa (job #1669612)
#include <fstream>
#include <vector>
#include <iostream>
#include <queue>
#include <algorithm>
#include <stack>
using namespace std;
ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");
vector <int> G[100005];
int n,m;
vector <bool> marcat;
vector <int> grade;
void bfs(int nod)
{
queue <int> q;
q.push(nod);
marcat[nod]=1;
while(!q.empty())
{
int u = q.front();
q.pop();
for(auto x : G[u])
if(!marcat[x])
q.push(x),marcat[x]=1;
}
}
bool conex()
{
bfs(1);
for(int i=2; i<=n; i++)
if(!marcat[i])
return 0;
return 1;
}
bool is_euler()
{
if(!conex())
return 0;
for(int i=1; i<=n; i++)
if(grade[i]%2)
return 0;
return 1;
}
vector <int>rez;
stack <int> s;
void euler(int nod)
{
while(!G[nod].empty())
{
int w = G[nod][0];
s.push(nod);
G[nod].erase(G[nod].begin());
for(int i=0;i<G[w].size();i++)
if(G[w][i]==nod)
G[w].erase(G[w].begin()+i);
nod = w;
}
}
int main()
{
int a,b;
f>>n>>m;
marcat.assign(n+1,false);
grade.assign(n+1,0);
for(int i=1; i<=m; i++)
{
f>>a>>b;
G[a].push_back(b);
G[b].push_back(a);
grade[a]++;
grade[b]++;
}
/*
euler (nod v)
cat timp (v are vecini)
w = un vecin aleator al lui v
sterge_muchie (v, w)
euler (w)
sfarsit cat timp
adauga v la ciclu
*/
if(is_euler())
{
int v=1;
do
{
euler(v);
v = s.top();
s.pop();
rez.push_back(v);
}
while( !s.empty() );
for(int i=0; i<rez.size(); i++)
g<<rez[i]<<" ";
}
else
{
g<<"-1";
}
g.close();
}