Pagini recente » Cod sursa (job #836441) | Cod sursa (job #3176232) | Cod sursa (job #1058399) | Cod sursa (job #1133384) | Cod sursa (job #403014)
Cod sursa(job #403014)
#include <fstream>
#include <cstdlib>
#include <list>
#include <queue>
#include <stack>
using namespace std;
const int NMAX=100004;
list <int> L[NMAX];
stack <int> S;
int E[NMAX],n,ne,g[NMAX];
void citire()
{
ifstream fin("ciclueuler.in");
int m,x,y;
fin>>n>>m;
while (m--)
{
fin>>x>>y;
++g[x]; ++g[y];
L[x].push_back(y); L[y].push_back(x);
}
fin.close();
}
void afisare(int sol)
{
ofstream fout("ciclueuler.out");
if (!sol) {fout<<"-1\n";}
else
{
for (int i=1;i<=ne;++i)
fout<<E[i]<<" ";
}
fout.close();
}
bool verif_eulerian()
{ int i;
for (i=1;i<=n;++i)
if (g[i]%2) return 0;
queue<int> Q; bool viz[NMAX]; int nrl;
memset(viz,0,sizeof(viz));
viz[1]=1; Q.push(1); nrl=1;
while (!Q.empty())
{
int x=Q.front(); Q.pop();
typeof(L[x].begin()) it;
for (it=L[x].begin(); it!=L[x].end();++it)
if (!viz[*it]) { viz[*it]=1; Q.push(*it); ++nrl;}
}
if (nrl<n) return 0;
return 1;
}
void sterge(int v, int w)
{
L[v].pop_front(); g[v]--;
typeof(L[w].begin()) it;
for (it=L[w].begin(); it!=L[w].end();++it)
if (*it==v)
{
L[w].erase(it);
g[w]--;
break;
}
}
void euler(int v)
{ int w;
while (g[v])
{
w=L[v].front();
S.push(v);
sterge(v,w);
v=w;
}
}
void rez()
{
int v=1; ne=0;
do
{
euler(v);
v=S.top(); S.pop();
E[++ne]=v;
}
while (!S.empty());
}
int main()
{
citire();
if (!verif_eulerian()) afisare(0);
rez();
afisare(1);
return 0;
}