Pagini recente » Cod sursa (job #1162814) | Cod sursa (job #2635686) | Cod sursa (job #2082615) | Cod sursa (job #947201) | Cod sursa (job #469558)
Cod sursa(job #469558)
#include <cstdio>
#include <iostream>
#include <list>
#include <queue>
#include <stack>
#include <vector>
using namespace std;
const int NMAX = 100005;
const int MMAX = 500005;
int N, M;
list<int> Graf[NMAX];
list<int> ord;
vector<bool> viz;
stack<int> stiva;
void citire()
{
int x, y;
cin >> N >> M;
for(int i = 1 ; i <= M ; i++)
{
cin >> x >> y;
Graf[x].push_back(y);
Graf[y].push_back(x);
}
}
void BFS(int nod)
{
viz.resize(NMAX);
queue<int> Q;
Q.push(nod);
while(!Q.empty())
{
nod = Q.front();
viz[nod] = 1;
Q.pop();
for(list<int> :: iterator itl = Graf[nod].begin() ; itl != Graf[nod].end() ; itl++)
if(!viz[*itl])
{
Q.push(*itl);
viz[*itl] = 1;
}
}
}
bool eulerian()
{
BFS(1);
for(int i = 1 ; i <= N ; i++)
if(Graf[i].size() % 2 == 1 || !viz[i])
return 0;
return 1;
}
void sterge(int x, int y)
{
Graf[x].pop_front();
for(list<int> :: iterator itl = Graf[y].begin() ; itl != Graf[y].end() ; itl++)
if(*itl == x)
{
Graf[y].erase(itl);
break;
}
}
void ciclu(int nod)
{
int nod2;
while(1)
{
if(Graf[nod].empty())
return;
nod2 = Graf[nod].front();
stiva.push(nod2);
sterge(nod, nod2);
nod = nod2;
}
}
bool rezolva()
{
if(eulerian() == 0)
return 0;
stiva.push(1);
do
{
ciclu(stiva.top());
ord.push_back(stiva.top());
stiva.pop();
}while(!stiva.empty());
return 1;
}
void scrie(int x)
{
if(x == 0)
printf("-1");
else
{
ord.pop_back();
for(list<int> :: iterator itl = ord.begin() ; itl != ord.end() ; itl++)
printf("%d ", *itl);
}
printf("\n");
}
int main()
{
freopen("ciclueuler.in", "r", stdin);
freopen("ciclueuler.out", "w", stdout);
citire();
scrie(rezolva());
return 0;
}