Pagini recente » Statistici sirbu ionut-adrian (ionutzs) | Cod sursa (job #1743844) | Cod sursa (job #2648244) | Cod sursa (job #1554748) | Cod sursa (job #1553666)
#include <iostream>
#include <fstream>
#include <list>
#include <stack>
#include <queue>
#define N_MAX 100001
#define pb push_back
#define forit(C,it) for( typeof(C.begin()) it = C.begin(); it != C.end(); it++ )
#define fori(i,k,n) for(int i=k;i<=n;i++)
using namespace std;
list<int> G[N_MAX],L;
stack<int> S;
queue<int> Q;
int N,M,deg[N_MAX];
bool use[N_MAX];
void cit()
{
ifstream f("ciclueuler.in");
f>>N>>M;
int x,y;
fori(i,1,M)
{
f>>x>>y;
G[x].pb(y),deg[x]++;
G[y].pb(x),deg[y]++;
}
f.close();
}
void BFS(int v)
{
Q.push(v),use[v]=true;
while(!Q.empty())
{
v=Q.front();Q.pop();
forit(G[v],it)
if(!use[*it])
Q.push(*it),use[*it]=true;
}
}
bool este_conex()
{
BFS(1);
fori(i,2,N) if(!use[i]) return false;
return true;
}
bool eulerian()
{
if(!este_conex()) return false;
fori(i,1,N) if(deg[i]%2)return false;
return true;
}
void sterge(int i, int j)
{
G[i].pop_front();
forit(G[j],it)
if(*it==i)
{
G[j].erase(it);
break;
}
}
void euler(int v)
{
int w;
while (true)
{
if(G[v].empty()) break;
w=G[v].front();
S.push(v);
sterge(v,w);
v=w;
}
}
bool rez()
{
if(!eulerian())
return false;
int v=1;
do
{
euler(v);
v=S.top();S.pop();
L.pb(v);
} while(!S.empty());
return true;
}
void scrie(bool ok)
{
ofstream g("ciclueuler.out");
if(!ok)
{
g<<-1;
g.close();
return;
}
forit(L,it)
g<<*it<<" ";
g.close();
}
int main()
{
cit();
scrie(rez());
return 0;
}