Pagini recente » Cod sursa (job #2891141) | Cod sursa (job #2208251) | Cod sursa (job #212827) | Cod sursa (job #2682386) | Cod sursa (job #2823080)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
using namespace std;
class Graf
{
int noduri, muchii;
bool ciclu_eulerian(vector<vector<int>>& vecini, vector<int>& grade, vector<int>& componente_ciclu_eulerian);
public:
Graf(int n, int m);
void solve_ciclu_eulerian(ifstream& f, ofstream& o);
};
Graf::Graf(int n, int m)
{
noduri = n;
muchii = m;
}
bool Graf::ciclu_eulerian(vector<vector<int>>& vecini, vector<int>& grade, vector<int>& componente_ciclu_eulerian)
{
for (int i = 1; i <= noduri; i++) // verific daca avem noduri de grad impar
if (grade[i] % 2)
return 0;
int varf = 1; // cautam primul nod cu grad != 0
while (varf <= noduri && grade[varf] == 0)
varf++;
if (varf == noduri + 1) // toate varfurile au gradul 0
return 1;
stack<int>st;
st.push(varf);
while (st.size())
{
varf = st.top();
if (vecini[varf].size() == 0)
{
componente_ciclu_eulerian.push_back(varf);
st.pop();
}
else
{
int varf2 = vecini[varf][0];
vecini[varf].erase(vecini[varf].begin());
for (int j = 0; j < vecini[varf2].size(); j++)
if (vecini[varf2][j] == varf)
{
vecini[varf2].erase(vecini[varf2].begin() + j);
break;
}
st.push(varf2);
}
}
for (int i = 1; i <= noduri; i++)
if (vecini[i].size())
return 0;
}
void Graf::solve_ciclu_eulerian(ifstream& f, ofstream& o)
{
vector<vector<int>>vecini(noduri + 1); // liste de adiacenta
vector<int>grade(noduri + 1, 0); // vector in care sunt stocate gradele varfurilor
vector<int>componente_ciclu_eulerian; // vector in care sunt stocate extremitatile muchiilor ce alcatuiesc ciclul eulerian(acolo unde exista unul)
for (int i = 0; i < muchii; i++)
{
int x, y; // extremitatile unei muchii
f >> x >> y;
vecini[x].push_back(y);
vecini[y].push_back(x);
grade[x]++;
grade[y]++;
}
if (ciclu_eulerian(vecini, grade, componente_ciclu_eulerian))
for (int i = 0; i < componente_ciclu_eulerian.size() - 1; i++)
o << componente_ciclu_eulerian[i] << " ";
//cout << 1;
else
o << -1;
}
int main()
{
ifstream f("ciclueuler.in");
ofstream o("ciclueuler.out");
int noduri, muchii;
f >> noduri >> muchii;
Graf g(noduri, muchii);
g.solve_ciclu_eulerian(f, o);
return 0;
}