Pagini recente » Cod sursa (job #1676581) | Cod sursa (job #192317) | Cod sursa (job #867995) | Cod sursa (job #2497771) | Cod sursa (job #634353)
Cod sursa(job #634353)
#include <fstream>
#include <list>
#include <stack>
#include <queue>
#include <cstring>
using namespace std;
#define pb push_back
#define NMAX 100002
#define SMAX 64
list<int> G[NMAX], L;
stack<int> S;
queue<int> Q;
int n, m, deg[NMAX], vis[NMAX];
char buffer[SMAX];
void read()
{
int x, y, cnt, res, i, j;
fgets(buffer, SMAX, stdin);
int len = strlen(buffer);
for (i=0; i<len; ++i) {
res = 0;
for (j=i; buffer[j]>='0' && buffer[j]<='9'; ++j)
res = res*10 + (buffer[j] - '0');
if (cnt == 0)
n = res;
else
m = res;
i = j;
++cnt;
}
while (m--) {
fgets(buffer, SMAX, stdin);
len = strlen(buffer);
cnt = 0;
for (i=0; i<len; ++i) {
res = 0;
for (j=i; buffer[j]>='0' && buffer[j]<='9'; ++j)
res = res*10 + (buffer[j] - '0');
if (cnt == 0)
x = res;
else
y = res;
i = j;
++cnt;
}
G[x].pb(y); ++deg[x];
G[y].pb(x); ++deg[y];
}
}
void BFS(int v)
{
Q.push(v); vis[v] = 1;
while (!Q.empty()) {
v = Q.front();
Q.pop();
for (list<int>::iterator it = G[v].begin(); it != G[v].end(); ++it) {
if (vis[*it] == 0) {
Q.push(*it);
vis[*it] = 1;
}
}
}
}
int is_connex()
{
BFS(1);
for (int v = 2; v <= n; ++v)
if (vis[v] == 0)
return 0;
return 1;
}
int eulerian()
{
if (is_connex() == 0)
return 0;
for (int v = 1; v <= n; ++v)
if (deg[v]&1)
return 0;
return 1;
}
void remove(int v, int w)
{
--deg[v], --deg[w];
G[v].pop_front();
for (list<int>::iterator it=G[w].begin(); it!=G[w].end(); ++it)
if (*it == v) {
G[w].erase(it);
break;
}
}
void euler(int v)
{
while (true) {
if (G[v].empty())
break;
int w = G[v].front();
S.push(v);
remove(v, w);
v = w;
}
}
int result()
{
int v = eulerian();
if (v == 0)
return -1;
do {
euler(v);
v = S.top(); S.pop();
L.pb(v);
} while (!S.empty());
return 1;
}
void print(int x)
{
if (x == -1)
printf("-1\n");
else {
for (list<int>::iterator it = L.begin(); it != L.end(); ++it)
printf("%d ", *it);
printf("\n");
}
}
int main()
{
freopen("ciclueuler.in", "r", stdin);
freopen("ciclueuler.out", "w", stdout);
read();
print(result());
return 0;
}