Pagini recente » Cod sursa (job #2097756) | Cod sursa (job #16374) | Cod sursa (job #502154) | Cod sursa (job #1204933) | Cod sursa (job #1502297)
#include <bits/stdc++.h>
#define nmax 100001
using namespace std;
vector<int> L[nmax];
int n, m, d[nmax];
stack<int> q;
bool viz[nmax];
void Citire()
{
int i, x, y;
ifstream fin("ciclueuler.in");
fin >> n >> m;
for (i = 1; i <= m; ++i)
{
fin >> x >> y;
d[x]++; d[y]++;
L[x].push_back(y);
L[y].push_back(x);
}
fin.close();
}
bool ToateGradelePare()
{
int i;
for (i = 1; i <= n; ++i)
if (d[i] % 2 == 1) return false;
return true;
}
void DFS(int k)
{
int i;
unsigned int j;
viz[k] = 1;
for (j = 0; j < L[k].size(); ++j)
{
i = L[k][j];
if (!viz[i]) DFS(i);
}
}
bool EsteConex()
{
int i;
DFS(1);
for (i = 1; i <= n; ++i)
if (!viz[i]) return false;
return true;
}
bool EsteEulerian()
{
if (!EsteConex()) return false;
if (!ToateGradelePare()) return false;
return true;
}
inline void Sterge(int k, int i)
{
unsigned int j, lung;
lung = L[k].size();
for (j = 0; j < lung; j++)
if (L[k][j] == i)
{
L[k][j] = L[k][lung - 1];
L[k].pop_back();
return;
}
}
void Euler1(int k)
{
int i;
while (L[k].size() > 0)
{
i = L[k][0];
/// sterg muchia (k, i)
L[k][0] = L[k][L[k].size() - 1];
L[k].pop_back();
/// sterg muchia (i, k)
Sterge(i, k);
Euler1(i);
}
q.push(k);
}
/*
void Euler(int k)
{
int i, lung;
while (true)
{
lung = L[k].size();
if (lung == 0) return;
i = L[k][0];
euler[++ne] = k;
/// sterg muchia (k, i)
L[k][0] = L[k][lung - 1];
L[k].pop_back();
/// sterg muchia (i, k)
Sterge(i, k);
/// continui cautarea din i
k = i;
}
}
*/
int main()
{
Citire();
ofstream fout("ciclueuler.out");
if (!EsteEulerian()) fout << "-1\n";
else
{
Euler1(1);
q.pop();
while (!q.empty())
{
fout << q.top() << " ";
q.pop();
}
fout << "\n";
}
fout.close();
return 0;
}