Pagini recente » Cod sursa (job #97807) | Cod sursa (job #592164) | Cod sursa (job #3240049) | Cod sursa (job #2318328) | Cod sursa (job #2822150)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <stack>
using namespace std;
ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");
class graf{
private:
int n, m;
bool vizitat[100005];
vector < pair<int,int> > v[100005];
public:
graf(int n, int m); // constructor
void CicluEuler();
void Euler(int Start);
void dfs(int a);
};
// constructor
graf :: graf(int n, int m)
{
this->n = n;
this->m = m;
}
void graf::dfs(int a)
{
vizitat[a]=true;
for(auto x: v[a])
{
if(vizitat[x.first]==false)
dfs(x.first);
}
}
void graf::Euler(int s)
{
bool vizitat[500005];
vector<int> rezultat; //stocam rez final
vector<int> vect; //dam push_back elem cu care urm sa lucram
vect.push_back(s); //adaugam nod start
while (!vect.empty()) //cat timp mai avem elem in vect
{
int curent=vect.back(); //noteam el curent
if (!v[curent].empty()) //daca mai are noduri la care se ajunge pornind din el
{
int urm=v[curent].back().first;
int nr=v[curent].back().second;
v[curent].pop_back(); //stergem elementul din vector
if (!vizitat[nr]) //daca la muchia cu nr respectiv nu s-a ajuns inca
{
vizitat[nr]=true; //marcam vizitata si o adaugam in vect de prelucrare
vect.push_back(urm);
}
}
else
{
vect.pop_back(); //cand se termina elem stergem elem pe care l-am lucrat
rezultat.push_back(curent); //il adaugam in vect final
}
}
for (size_t i=0; i<rezultat.size()-1; i++)
g <<rezultat[i]<<" ";
}
void graf::CicluEuler()
{
int x, y, grd[100005];
bool vizitat[100005];
for (int i=1; i<=m; i++)
{
f>>x>>y;
v[x].push_back(make_pair(y,i));
v[y].push_back(make_pair(x,i));
grd[x]++;//gradul lui x
grd[y]++;//gradul lui y
}
for ( int i=0; i<=n; i++ )
if ( grd[i]%2==1 )
{
g << "-1";
return;
}
Euler(1);
}
int main()
{
int n, m;
f >> n >> m;
graf G(n, m);
G.CicluEuler();
return 0;
}