Pagini recente » Istoria paginii utilizator/cristyklu | Profil tea | Istoria paginii utilizator/sea_wolf | Monitorul de evaluare | Cod sursa (job #1461330)
#include <fstream>
#include <vector>
#include <stack>
using namespace std;
#define MAX 100005
/*fisiere de intrare respectiv iesire*/
ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");
/*lista de adiacenta*/
vector<int> graf[MAX];
/*stiva de noduri din ciclue*/
stack<int> ciclu;
/*gradul fiecarui nod*/
int grad[MAX];
/*vector de noduri vizitate*/
bool vizitat[MAX];
/*functie de eliminare a unui element dintr-o lista de adiacenta*/
bool EraseElement(vector<int> &v, int elem)
{
vector<int>::iterator it;
for(it = v.begin(); it != v.end(); it++)
{
if(*it == elem)
break;
}
if(it != v.end())
{
v.erase(it);
return true;
}
return false;
}
int n, m; /*numarul de noduri, respectiv numarul de laturi*/
/*Functie de citrire*/
void Citire()
{
fin >> n >> m;
for(int i = 0; i < m; i++)
{
int nod1, nod2;
fin >> nod1 >> nod2;
// cout << nod1 << " " << nod2 << endl;
graf[nod1].push_back(nod2);
graf[nod2].push_back(nod1);
grad[nod1]++; grad[nod2]++;
}
}
void DFS(int nod)
{
vizitat[nod] = true;
for(vector<int>::iterator it = graf[nod].begin(); it != graf[nod].end(); it++)
{
if(!vizitat[*it])
DFS(*it);
}
}
void Euler()
{
int nod, adiacent;
ciclu.push(1);
while(!ciclu.empty())
{
nod = ciclu.top();
if (!graf[nod].empty())
{
adiacent = graf[nod].back();
graf[nod].pop_back();
EraseElement(graf[adiacent], nod);
ciclu.push(adiacent);
}
else
{
fout << nod << " ";
ciclu.pop();
}
}
}
bool Verificare()
{
for(int i = 1; i <= n; i++)
{
if(!vizitat[i] || grad[i] % 2 != 0) return false;
}
return true;
}
int main()
{
Citire();
DFS(1);
if(Verificare())
{
Euler();
fout << '\n';
}
else
fout << "-1\n";
return 0;
}