Pagini recente » Cod sursa (job #391232) | Cod sursa (job #760751) | Cod sursa (job #3228971) | Cod sursa (job #271190) | Cod sursa (job #1439181)
#include <iostream>
#include <fstream>
#include <vector>
#include <bitset>
#include <stack>
#define MAX_N 100005
#define MAX_M 500005
using namespace std;
vector <int> G[MAX_N];
bitset <MAX_N> viz;
int ciclu_eulerian[MAX_M];
int dim = 0;
void dfs(int nod)
{
stack <int> S;
S.push(nod);
while(S.size())
{
int top = S.top();
S.pop();
viz[top] = 1;
for(int i = 0; i < G[top].size(); i++)
{
if(viz[G[top][i]] == 0)
S.push(G[top][i]);
}
}
}
void euler(int nod)
{
while(!G[nod].empty())
{
int u = G[nod].back();
G[nod].pop_back();
for(vector<int>::iterator it = G[u].begin(); it != G[u].end(); it++)
if(*it == nod)
{ G[u].erase(it); break; }
euler(u);
ciclu_eulerian[++dim] = nod;
}
}
int main()
{
int i,N,M,x,y;
int ok1 = 1, ok2 = 1;
freopen("ciclueuler.in", "r", stdin);
scanf("%d%d", &N, &M);
for(i = 1; i <= M; i++)
{
scanf("%d%d", &x, &y);
G[x].push_back(y);
G[y].push_back(x);
}
dfs(1);
for(i = 1; i <= N; i++)
if(viz[i] == 0)
{ ok1 = 0; break; } // nu e conex
if(ok1 != 0)
{
for(i = 1; i <= N; i++)
if(G[i].size()%2 != 0)
{ ok2 = 0; break; } //nu toate nodurile au grad par
}
freopen("ciclueuler.out", "w", stdout);
if(ok1 !=0 && ok2 !=0)
{
euler(1);
for(i = 1; i <= dim; i++)
printf("%d ", ciclu_eulerian[i]);
}
else
printf("%d", -1);
return 0;
}