Pagini recente » Cod sursa (job #330432) | Cod sursa (job #267054) | Cod sursa (job #136548) | Cod sursa (job #3291837) | Cod sursa (job #419039)
Cod sursa(job #419039)
// Catalin Balan
// Tue Mar 16 17:21:56 EET 2010
// Ciclu Eulerian
#include <cstdio>
#include <cstdlib>
#include <vector>
#include <algorithm>
#include <queue>
#include <stack>
#include <bitset>
using namespace std;
#define NMAX 100005
#define CHUNK 8192
#define FIN "ciclueuler.in"
#define FOUT "ciclueuler.out"
char g_buf[CHUNK];
int g_p=CHUNK-1;
inline int get()
{
int x = 0;
while (g_buf[g_p] < '0' || g_buf[g_p] > '9')
if (++g_p == CHUNK) fread(g_buf,1,CHUNK,stdin), g_p=0;
while (g_buf[g_p] >= '0' && g_buf[g_p] <= '9')
{
x = x*10 + g_buf[g_p]-'0';
if (++g_p == CHUNK) fread(g_buf,1,CHUNK,stdin), g_p=0;
}
return x;
}
int n,m;
vector<int> G[NMAX];
queue<int> Q;
stack<int> S;
bitset<NMAX> viz;
bool eulerianGraph()
{
for (int i = 1; i <= n; ++i)
if ((G[i].size() & 1) == 1) return false;
Q.push(1);
viz[1] = 1;
int nod;
while (!Q.empty())
{
nod = Q.front();
Q.pop();
for (vector<int>::iterator it = G[nod].begin(); it != G[nod].end(); ++it)
{
if (viz[*it]) continue;
viz[*it] = 1;
Q.push(*it);
}
}
if (viz.count() == n) return true;
return false;
}
void deleteEdge( int a, int b)
{
G[a].pop_back();
G[b].erase( find(G[b].begin(), G[b].end(), a) );
}
void getCycle(int u)
{
while ( !G[u].empty() )
{
S.push(u);
int v = G[u].back();
deleteEdge(u,v);
u = v;
}
}
void solve()
{
int u = 1;
do
{
getCycle(u);
u = S.top();
S.pop();
printf("%d ", u);
} while (!S.empty());
printf("\n");
}
int main(int argv, char ** argc)
{
freopen(FIN, "r", stdin);
freopen(FOUT, "w", stdout);
n = get();
m = get();
for (; m; --m)
{
int x = get();
int y = get();
G[x].push_back(y);
G[y].push_back(x);
}
if ( !eulerianGraph() )
{
printf("-1\n");
exit(EXIT_SUCCESS);
}
solve();
return EXIT_SUCCESS;
}