Nadesłany przez Emil Hotkowski, 29 stycznia 2013 21:15
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.Pobierz pełne rozwiązanie.
Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.
cykl_eulera.cpp:
//Wyszukiwanie cyklu Eulera w grafie
//www.algorytm.org
#include <iostream>
#include <cstdio>
#include <map>
#include <stack>
#include <set>
#include <list>
#include <algorithm>
#include <vector>
#include <cmath>
#include <string>
#define FOR(i,p,k) for(int i = (p);i<(k);i++)
#define PB push_back
using namespace std;
struct krawedz//nasza struktura reprezentujaca krawedzie w grafie
{
int x;//dokad porawdzi krawedz
list<krawedz>::iterator przeciwna;//iterator do przeciwnej krawedzi
};
//iterato pomoze nam w czsie stalym usuwac krawedzi z grafu :)
vector<int> CE;//tu wrzucamy kolejne wierzcholki naszego cyklu
stack<int> STOS;//stos na potrzeby naszego algorytmu
int n,m;//ilosc wierzcholkow i krawedzi
list<krawedz> ZA[1000007];//tutaj trzymamy nasz graf
//pobiera dane od uzytkownika
void dane()
{
//pobierz liczbe wierzcholkow i krawedzi
cin>>n>>m;
FOR(i,0,m)
{
int a,b;
//pobierz indeksy wierzcholkow
cin>>a>>b;
krawedz k;//wrzucamy krawedzi do grafu
k.x=b;
ZA[a].PB(k);
k.x=a;
ZA[b].PB(k);
list<krawedz>::iterator it;
it=ZA[a].end();it--;
ZA[b].back().przeciwna=it;//wrzucamy iterator do przeciwnej
it=ZA[b].end();it--;
ZA[a].back().przeciwna=it;
}
}
//wyszukuje cykl Eulera
void cykle()
{
STOS.push(1);
while(STOS.size())
{
int v=STOS.top();
if(!ZA[v].empty())
{
list<krawedz>::iterator it, it_przeciwna;
it = ZA[v].begin(); //wez pierwsza krawedz dla aktualnego wierzcholka
it_przeciwna = it->przeciwna;
int u = it->x;
STOS.push(u); //poloz ja na stosie
ZA[v].erase(it); //usuwamy przeciwne
ZA[u].erase(it_przeciwna);
v=u;
}
else//jezeli wierzcholek nie ma juz krawedzi wychodzacych
{
STOS.pop();
CE.PB(v);// to wrzucamy go na vector
}
}
}
//wypisuje wynik
void wys()
{
FOR(i,0,CE.size())
cout<<"-> "<<CE[i]<<"\n";
}
//glowne wejscie do programu
int main()
{
dane(); //pobierz dane
cykle(); //wyszukaj cykl Eulera
wys(); //wypisz wynik
system("PAUSE");
return 0;
}

