Pagini recente » Cod sursa (job #479037) | Cod sursa (job #579908) | Cod sursa (job #1246523) | Cod sursa (job #2640231) | Cod sursa (job #2810435)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");
int n, m, viz[500003], sol[500003], v[100003], g[100003], p;
int st[500003], dr[500003];
unsigned int poz[500003];
vector<int> h[100003];
void Grad()
{
int i;
for (i = 1; i <= n; i++)
g[i] = h[i].size();
}
int Conex(int k)
{
Grad();
int x;
queue<int> q;
q.push(k);
v[k] = 1;
while (!q.empty())
{
x = q.front();
q.pop();
for (int w : h[x])
if (v[w] == 0)
{
v[w] = 1;
q.push(w);
}
}
for (int i = 1; i <= n; i++)
if (v[i] == 0 && g[i] != 0) return 0;
return 1;
}
int ToatePare()
{
for (int i = 1; i <= n; i++)
if (g[i] & 1) return 0;
return 1;
}
void Euler(int k)
{
int i;
while (poz[k] < h[k].size())
{
i = h[k][poz[k]];
poz[k]++;
if (viz[i] == 0)
{
viz[i] = 1;
Euler(st[i] + dr[i] - k);
}
}
sol[++p] = k;
}
void Afis()
{
int i;
for (i = 1; i <= p; i++)
fout << sol[i] << " ";
}
int main()
{
int i;
fin >> n >> m;
for (i = 1; i <= m; i++)
{
fin >> st[i] >> dr[i];
h[st[i]].push_back(i);
h[dr[i]].push_back(i);
}
if (Conex(1) == 0 || ToatePare() == 0) fout << "-1\n";
else
{
Euler(1);
Afis();
}
fout.close();
}