Pagini recente » Cod sursa (job #2544591) | Cod sursa (job #2840041) | Cod sursa (job #663238) | Cod sursa (job #2281812) | Cod sursa (job #1461321)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
#define MAX 100000
/*fisiere de intrare respectiv iesire*/
ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");
/*lista de adiacenta*/
vector<int> graf[MAX];
/*gradul fiecarui nod*/
int grad[MAX];
bool vizitat[MAX];
/*ciclu euler*/
vector<int> ciclu;
/*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)
{
for(vector<int>::iterator it = graf[nod].begin(); it != graf[nod].end(); it++)
{
if(!vizitat[*it])
{
vizitat[*it] = true;
DFS(*it);
}
}
}
void Euler(int nod)
{
while(!graf[nod].empty())
{
int adiacent = graf[nod].front();
EraseElement(graf[nod], adiacent);
EraseElement(graf[adiacent], nod);
Euler(adiacent);
}
ciclu.push_back(nod);
}
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(1);
for(vector<int>::iterator it = ciclu.begin(); it != ciclu.end(); it++)
{
fout << *it << " ";
}
fout << '\n';
}
else
{
fout << "-1\n";
}
return 0;
}