Pagini recente » Cod sursa (job #1683400) | Cod sursa (job #3138975) | Cod sursa (job #2277144) | Cod sursa (job #2273144) | Cod sursa (job #1438352)
#include <iostream>
#include <fstream>
#include <vector>
#include <bitset>
#include <stack>
using namespace std;
ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");
#define MAX_N 100005
#define MAX_M 500005
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;
f>>N>>M;
for(i = 1; i <= M; i++)
{
f>>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
}
if(ok1 !=0 && ok2 !=0)
{
euler(1);
for(i = 1; i <= dim; i++)
g<<ciclu_eulerian[i]<<" ";
}
else
g<<-1;
return 0;
}