Pagini recente » Cod sursa (job #45846) | Cod sursa (job #1214560) | Cod sursa (job #3122444) | Cod sursa (job #707969) | Cod sursa (job #532779)
Cod sursa(job #532779)
#include<fstream>
#include<list>
#include<stack>
#include<queue>
#define inf "ciclueuler.in"
#define outf "ciclueuler.out"
#define NMax 100100
#define MMax 500100
using namespace std;
fstream f(inf,ios::in),g(outf,ios::out);
int N, M;
int deg[NMax], viz[NMax];
stack<int> S;
list<int> LA[NMax], C;
list<int>::iterator it;
void read()
{
f>>N>>M; int a,b;
for(int i=1; i<=M; i++)
{
f>>a>>b;
deg[a]++; deg[b]++;
LA[a].push_back(b); LA[b].push_back(a);
}
}
void BFS(int nod)
{
queue<int> Q; Q.push(nod); viz[nod] = 1;
while( !Q.empty() )
{
int u = Q.front(); Q.pop();
for( it=LA[u].begin(); it!=LA[u].end(); it++ )
{
int v = (*it);
if( viz[v] ) continue;
viz[v] = 1; Q.push(v);
}
}
}
bool admite_euler()
{
BFS(1);
for(int i=1; i<=N; i++)
if( !viz[i] ) return false;
for(int i=1; i<=N; i++)
if( deg[i]%2 ) return false;
return true;
}
void sterge(int u,int v)
{
deg[u]--; deg[v]--;
LA[u].pop_front();
for( it=LA[v].begin(); it!=LA[v].end(); it++ )
if( (*it)==u ) { LA[v].erase(it); return; }
}
void euler(int u)
{
while(true)
{
if( LA[u].empty() ) return;
int v = LA[u].front();
S.push(u);
sterge(u,v);
u = v;
}
}
void solve()
{
if( !admite_euler() ) { g<<"-1"; return; }
int u = 1;
do
{
euler(u);
u = S.top(); S.pop();
C.push_back(u);
}
while( !S.empty() );
for( it=C.begin(); it!=C.end(); it++ ) g<< (*it) <<" ";
}
int main()
{
read(); solve();
f.close(); g.close();
return 0;
}