Pagini recente » Cod sursa (job #1295653) | Cod sursa (job #535858) | Cod sursa (job #2264401) | Cod sursa (job #1619200) | Cod sursa (job #2820802)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <stack>
#include <algorithm>
#include <climits>
#define MAX 100001
#define MAXCTC 500001
#define dijMax 50001
#define MAXbf 1001
#define MAXapm 2001
#define MAXmtrx 101
using namespace std;
ifstream ineuler("ciclueuler.in");
ofstream outeuler("ciclueuler.out");
class Graf
{
int NrNoduri;
public:
vector<int> Adiacenta[MAX];
Graf(int NrNoduri);
void AdaugaMuchie(int nod, int nodConectat);
void AdaugaMUchieNeorientat(int nod, int nodConectat);
vector<int> Euler(int nod, bool Vizitat[MAX], vector<pair<int,int>> AdiacentaEuler[MAX]);
};
//ADAUGARE MUCHII
Graf::Graf(int NrNoduri)
{
this->NrNoduri = NrNoduri;
}
void Graf::AdaugaMuchie(int nod, int nodConectat)
{
Adiacenta[nod].push_back(nodConectat);
}
void Graf::AdaugaMUchieNeorientat(int nod, int nodConectat)
{
Adiacenta[nod].push_back(nodConectat);
Adiacenta[nodConectat].push_back(nod);
}
vector<int> Graf::Euler(int nod, bool Vizitat[MAXCTC], vector<pair<int,int>> AdiacentaEuler[MAX])
{
vector<int> Raspuns;
stack<int> Stiva;
Stiva.push(nod);
while(!Stiva.empty())
{
nod = Stiva.top();
if(!AdiacentaEuler[nod].empty())
{
int ordine = AdiacentaEuler[nod].back().first;
int vecin = AdiacentaEuler[nod].back().second;
AdiacentaEuler[nod].pop_back();
if(!Vizitat[ordine])
{
Vizitat[ordine] = 1;
Stiva.push(vecin);
}
}
else
{
Raspuns.push_back(nod);
Stiva.pop();
}
}
return Raspuns;
}
int main()
{
int N, M;
ineuler >> N >> M;
Graf g(N);
int nod1, nod2;
vector<pair<int,int>> AdiacentaEuler[MAX];
for(int i = 0; i < M; i++)
{
ineuler >> nod1 >> nod2;
AdiacentaEuler[nod1].push_back(make_pair(i, nod2));
AdiacentaEuler[nod2].push_back(make_pair(i, nod1));
}
bool Vizitat[MAXCTC] = {0};
vector<int> Raspuns;
for(int i = 0; i <= N; i++)
{
if(AdiacentaEuler[i].size() & 1)
{
outeuler << "-1";
return 0;
}
}
Raspuns = g.Euler(1, Vizitat, AdiacentaEuler);
for(int i = 0; i < Raspuns.size() - 1; i++)
outeuler << Raspuns[i] << " ";
return 0;
}