Pagini recente » Cod sursa (job #1108473) | Cod sursa (job #218594) | Cod sursa (job #2726106) | Cod sursa (job #2711531) | Cod sursa (job #915825)
Cod sursa(job #915825)
#include <cstdio>
#include <list>
#include <stack>
#include <cstring>
#include <queue>
#define NMAX 100001
using namespace std;
list < int > G[NMAX];
stack < int > S;
queue < int > Q;
int n;
bool viz[NMAX];
void read()
{
int m;
int x;
int y;
freopen("ciclueuler.in", "r", stdin);
scanf("%d %d\n", &n, &m);
while(m --)
{
scanf("%d %d\n", &x, &y);
G[x].push_back(y);
G[y].push_back(x);
}
}
void dfs(int v)
{
viz[v] = 1;
for(typeof(G[v].begin()) i = G[v].begin(); i != G[v].end(); ++ i)
{
int x = *i;
if(!viz[x])
dfs(x);
}
}
bool isConex()
{
dfs(1);
for(int i = 1; i <= n; ++ i)
if(!viz[i])
return 0;
return 1;
}
bool isEuler()
{
memset(viz, 0, sizeof(viz));
if(!isConex())
return 0;
for(int i = 1; i <= n; ++ i)
if(G[i].size() % 2 != 0)
return 0;
return 1;
}
void Remove(int x, int y)
{
for(typeof(G[y].begin()) i = G[y].begin(); i != G[y].end(); ++ i)
if(*i == x)
{
G[y].erase(i);
return;
}
}
void Euler(int v)
{
while(!G[v].empty())
{
int w = G[v].front();
G[v].pop_front();
Remove(v, w);
S.push(v);
v = w;
}
}
void findCicle()
{
int v = 1;
do {
Euler(v);
v = S.top();
S.pop();
Q.push(v);
} while(!S.empty());
}
void write()
{
freopen("ciclueuler.out", "w", stdout);
while(!Q.empty())
{
printf("%d ", Q.front());
Q.pop();
}
printf("\n");
}
int main()
{
read();
if(!isEuler())
{
printf("-1\n");
return 0;
}
findCicle();
write();
return 0;
}