Pagini recente » Cod sursa (job #964343) | Cod sursa (job #2930192) | Diferente pentru utilizator/luijika_programatorul intre reviziile 8 si 7 | Cod sursa (job #3309534) | Cod sursa (job #3317668)
#include <iostream>
#include <fstream>
#include <vector>
#include <stack>
using namespace std;
ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");
int n, m, u, v, grad[100001], cnt, viz[100001], cnt2;
vector <int> g[100001], sol;
stack <int> st;
void verif(int x)
{
viz[x] = 1;
for(int vecin : g[x])
if(viz[vecin] == 0)
verif(vecin);
}
void dfs(int x, int tata)
{
st.push(x);
if(cnt == n)
{
while (!st.empty())
{
int node = st.top();
st.pop();
sol.push_back(node);
}
for(int i = 0; i < sol.size() - 1; i++)
fout << sol[i] << " " << sol[i + 1] << " ";
exit(0);
}
for(int vecin : g[x])
if (grad[vecin] && vecin != tata) {
grad[x]--;
grad[vecin]--;
if (!grad[x])
cnt++;
if (!grad[vecin])
cnt++;
dfs(vecin, x);
grad[x]++;
grad[vecin]++;
if (grad[x] == 1)
cnt--;
if (grad[vecin] == 1)
cnt--;
}
st.pop();
}
int main()
{
fin >> n >> m;
for(int i = 1; i <= m; i++)
{
fin >> u >> v;
g[u].push_back(v);
g[v].push_back(u);
grad[u]++;
grad[v]++;
}
for(int i = 1; i <= n; i++)
if(grad[i] % 2 == 1)
{
fout << "-1\n";
return 0;
}
for (int i = 1; i <= n; i++){
if (viz[i] == 0)
verif(i), cnt2++;
if(cnt2 > 1)
{
fout << "-1\n";
return 0;
}
}
dfs(1, 0);
return 0;
}