Pagini recente » Cod sursa (job #2329066) | Cod sursa (job #854883) | Cod sursa (job #1909830) | Cod sursa (job #2783871) | Cod sursa (job #1182807)
#include <iostream>
#include <fstream>
#include <vector>
#include <stack>
#include <bitset>
#include <algorithm>
using namespace std;
const int Nmax = 100555;
const int Mmax = 500555;
int E[Mmax]; // informatia despre muchie
char used[Mmax]; // muchie folosita sau nu ?
int deg[Nmax]; // gradul varfului
vector<int> G[Nmax];
int main()
{
ifstream f ("ciclueuler.in");
ofstream g ("ciclueuler.out");
int N, M, a, b;
f >> N >> M;
for (int i = 0; i < M; i++)
{
f >> a >> b;
deg[--a]++;
deg[--b]++;
G[a].push_back(i);
if (a != b) G[b].push_back(i);
E[i] = a+b; // muchia[i] = (a+b);
}
bool ok = 1;
for (int i = 0; i < N; i++)
if (deg[i] %2 == 1)
{
ok = 0;
break;
}
/*
for (int i = 0; i < M; i++)
g << E[i] << (i == M-1 ? '\n' : ' ');
for (int i = 0; i < N; i++)
g << i << ":" << deg[i] << (i == N-1 ? '\n' : ' ');
for (int i = 0; i < M; i++)
g << used[i] << ' '; g << '\n';
*/
if (ok)
{
stack<int> S;
vector<int> sol;
S.push(0);
while(!S.empty())
{
int varf = S.top();
if(deg[varf] == 0)
{
S.pop();
sol.push_back(varf+1); // de la 0-indexed la 1-indexed;
} else {
while(used[G[varf].back()])
G[varf].pop_back();
int i = G[varf].back();
int vecin = E[i] - varf;
S.push(vecin);
deg[vecin]--;
deg[varf]--;
used[i] = 1;
}
}
sol.pop_back(); // ultimul nod nu-i necesar
for (auto x: sol)
g << x << ' ';
g << '\n';
} else {
g << -1 << '\n';
}
return 0;
}