Pagini recente » Cod sursa (job #2767121) | Cod sursa (job #2851709) | Cod sursa (job #322409) | Cod sursa (job #2499836) | Cod sursa (job #2198318)
#include <fstream>
#include <vector>
#include <stack>
#include <bitset>
#define MMX 500002
#define NMX 100002
using namespace std;
ifstream f("ciclueuler.in");
ofstream o("ciclueuler.out");
/**
Ideea generale:
Retinem muchiile si nodurile care le compun.
Astfel stergerea unei muchii se va face in O(1)
*/
class edge
{
public:
int vert1, vert2;
};
int n,m, grad[NMX];
edge e[MMX];
vector <int> g[NMX];
stack <int> st;
bitset <MMX> viz;
void input()
{
f >> n >> m;
for(int i = 1; i <= m; ++i)
{
f >> e[i].vert1 >> e[i].vert2;
g[e[i].vert1].push_back(i);
g[e[i].vert2].push_back(i);
grad[e[i].vert1] ++;
grad[e[i].vert2] ++;
}
}
void euler()
{
st.push(1);
viz.set();
int i_edge, de_adaugat;
while(not st.empty())
{
int nod = st.top();
if(g[nod].size())
{
i_edge = g[nod].back();
g[nod].pop_back();
if(viz[i_edge] == false)
continue;
viz[i_edge] = false;
de_adaugat = (e[i_edge].vert1 == nod ? e[i_edge].vert2 : e[i_edge].vert1);
st.push(de_adaugat);
}
else
{
o << nod << ' ';
st.pop();
}
}
o << '\n';
}
int main()
{
input();
for(int i = 1; i <= n; ++i)
if(grad[i] % 2)
{
o << -1 << '\n';
return 0;
}
euler();
return 0;
}