Pagini recente » Cod sursa (job #1838843) | Cod sursa (job #2053306) | Cod sursa (job #1463989) | Cod sursa (job #2580940) | Cod sursa (job #1731839)
#include <stdio.h>
#include <queue>
#include <list>
#include <stack>
#include <string.h>
#define MAXN 100001
int numarNoduri, copieNumarNoduri, numarMuchii, nodCurent, gradNod[MAXN] = {0}, i, vecin, nodx, nody;
FILE *inputFile = fopen("ciclueuler.in", "r"), *outputFile = fopen("ciclueuler.out", "w");
std::queue<int> coada;
std::list<int> vecini[MAXN], cicluEuler;
std::stack<int> stiva;
bool vizitat[MAXN];
void BFS(int nodPlecare)
{
memset(vizitat, 0, sizeof(bool)*MAXN);
copieNumarNoduri = numarNoduri;
coada.push(nodPlecare);
while(!coada.empty())
{
nodCurent = coada.front(); coada.pop();
for(std::list<int>::iterator it = vecini[nodCurent].begin(); it != vecini[nodCurent].end(); it++)
{
vecin = *it;
if(vizitat[vecin] == false)
{
vizitat[vecin] = true;
coada.push(vecin);
copieNumarNoduri--;
}
}
}
}
void parcurgereEuler(int nodPlecare)
{
while(!vecini[nodPlecare].empty())
{
vecin = vecini[nodPlecare].front(); vecini[nodPlecare].pop_front();
for(std::list<int>::iterator it = vecini[vecin].begin(); it != vecini[vecin].end(); it++)
if( *it == nodPlecare)
{
vecini[vecin].erase(it);
break;
}
stiva.push(nodPlecare);
nodPlecare = vecin;
}
}
int main()
{
fscanf(inputFile, "%d %d", &numarNoduri, &numarMuchii);
for(i = 1; i <= numarMuchii; i++)
{
fscanf(inputFile, "%d %d", &nodx, &nody);
if(nodx != nody)
{
vecini[nodx].push_back(nody);
vecini[nody].push_back(nodx);
gradNod[nodx]++;
gradNod[nody]++;
}
else
{
vecini[nodx].push_back(nodx);
gradNod[nodx] +=2;
}
}
//for(std::list<int>::iterator it = vecini[3].begin(); it != vecini[3].end(); it++)
// fprintf(outputFile, "%d ", *it);
// fprintf(outputFile, "\n");
BFS(1);
if(copieNumarNoduri > 0)
{
fprintf(outputFile, "%d\n", -1);
return 0;
}
for(int nod = 0; nod < numarNoduri; nod++)
if(gradNod[nod] % 2 != 0)
{
fprintf(outputFile, "%d\n", -1);
return 0;
}
int nod = 1;
do {
parcurgereEuler(nod);
nod = stiva.top(); stiva.pop();
cicluEuler.push_back(nod);
} while(!stiva.empty());
for(std::list<int>::iterator it = cicluEuler.begin(); it != cicluEuler.end(); it++)
fprintf(outputFile, "%d ", *it);
fprintf(outputFile, "\n");
return 0;
}