Pagini recente » Istoria paginii runda/7312 | Cod sursa (job #1824053) | Cod sursa (job #711658) | Cod sursa (job #974172) | Cod sursa (job #1734961)
#include<stdio.h>
#include<list>
#include<stack>
#include<queue>
#define MAXN 100001
//nu merge asa pentru ca typeof nu exista in C++
/*#define TRAVERSARE(C, it) for( typeof(C.begin()) it = C.begin(); it != C.end(); it++ )*/
std::list<int> adiacenta[MAXN], cicluEulerian;
std::stack<int> stiva;
std::queue<int> coada;
FILE *inputFile=fopen("ciclueuler.in","r"), *outputFile=fopen("ciclueuler.out","w");
int n, m, adiacent, gradNod[MAXN], vizitat[MAXN];
void bfs(int v)
{
coada.push(v); vizitat[v]=1;
while( !coada.empty() )
{
v=coada.front(); coada.pop();
for(std::list<int>::iterator it = adiacenta[v].begin(); it != adiacenta[v].end(); it++)
{
adiacent=*it;
if(vizitat[adiacent] == 0)
coada.push(adiacent); vizitat[adiacent]=1; //printf("%d", adiacent);
}
}
}
int eConex()
{
bfs(1);
for(int v=2; v<=n; v++)
if(vizitat[v] == 0)
return 0;
return 1;
}
int eEulerian()
{
if(eConex() == 0)
return 0;
for(int v=1; v<=n; v++)
if(gradNod[v]%2 == 1)
return 0;
return 1;
}
void stergeMuchie(int v, int w)
{
gradNod[v]--; gradNod[w]--;
adiacenta[v].pop_front();
for(std::list<int>::iterator it = adiacenta[w].begin(); it != adiacenta[w].end(); it++)
if(*it == w) //am gasit un ciclu
{
adiacenta[w].erase(it); //elimin muchia
break;
}
}
void reunescCicluri(int v)
{
while(true)
{
if(adiacenta[v].empty())
break;
int w=adiacenta[v].front();
stiva.push(v);
stergeMuchie(v,w);
v=w;
}
}
int rezultat()
{
int v=eEulerian();
if(v == 0)
return -1;
do{
reunescCicluri(v);
v=stiva.top(); stiva.pop();
cicluEulerian.push_back(v);
}while( !stiva.empty() );
}
void scrieRezultat(int returnat)
{
if(returnat == -1)
fprintf(outputFile, "-1\n");
else
{
for(std::list<int>::iterator it = cicluEulerian.begin(); it != cicluEulerian.end(); it++)
fprintf(outputFile, "%d ", *it);
fprintf(outputFile, "\n");
}
}
int main()
{
int u,v;
fscanf(inputFile, "%d %d", &n, &m);
for(int i=1; i<=m; i++)
{
fscanf(inputFile, "%d %d", &u, &v);
if(u != v)
{
adiacenta[u].push_back(v); gradNod[u]++;
adiacenta[v].push_back(u); gradNod[v]++;
}
else
{
adiacenta[u].push_back(u); gradNod[u]+=2;
}
}
for(std::list<int>::iterator it = adiacenta[4].begin(); it != adiacenta[4].end(); it++)
printf("%d", *it);
scrieRezultat(rezultat());
return 0;
}