dlaczego?
Ukryta treść:
Kod: Zaznacz cały
#include "SCC.h"
/*
algorytm wyszukiwania silnie spojnych skladowych grafu skierowanego
zlozonosc obliczeniowa: O(V+E)
Adj-listy sasiedztwa
SCC-silnie spojne skladowe (poczatkowo puste)
*/
namespace X
{
vector<COLOR> color;
int TIME(0);
}
/*
0,1,2,...,n-1 - wierzcholki grafu
Adj-listy sąsiedztwa
u-wierzcholek poczatkowy
Q-kolejka pomocna w pracy na transpozycji grafu
*/
// ****okrojony DFS****
void DFS_visit( vector< vector<int> > &Adj, int u, queue<int> &Q)
{
X::color[u]=GREY;
X::TIME++;
for(int j(0); j<Adj[u].size(); ++j)
if(X::color[Adj[u][j]]==WHITE)
DFS_visit(Adj, Adj[u][j], Q);
X::color[u]=BLACK; //wierzcholek zostal przetworzony
Q.push(u);
}
//-------------------------------------------------------------------
//lekka przerobka na potrzeby przeszukiwania transpozycji
void DFS_visit_T( vector< vector<int> > &Adj, int u, vector< vector<int> > &SCC, int counter)
{
X::color[u]=GREY;
X::TIME++;
for(int j(0); j<Adj[u].size(); ++j)
if(X::color[ Adj[u][j] ]==WHITE)
DFS_visit_T(Adj, Adj[u][j], SCC, counter);
X::color[u]=BLACK; //wierzcholek zostal przetworzony
SCC[counter].push_back(u);
}
//-------------------------------------------------------------------
//wlasciwy algorytm
void Strongly_Connected_Components(vector< vector<int> > &Adj, vector< vector<int> > &SCC)
{
//przeszukiwanie w glab
int n(Adj.size());
queue<int> Q;
X::color.resize(n);
for(int i(0); i<n; ++i)
X::color[i]=WHITE;
for(int i(0); i<n; ++i)
if(X::color[i]==WHITE)
DFS_visit(Adj, i, Q);
//wyznaczanie transpozycji grafu
vector< vector<int> > AdjT(n);
for(int i(0); i<n; ++i)
for(int j(0); j<Adj[i].size(); ++j)
AdjT[Adj[i][j]].push_back(i);
//przeszukiwanie transpozycji grafu
int counter(0);
for(int i(0); i<n; ++i)
X::color[i]=WHITE;
for(int i(0); i<n; ++i)
{
if(X::color[Q.front()]==WHITE)
{
SCC.resize(counter+1);
DFS_visit_T(AdjT, Q.front(), SCC, counter++);
}
Q.pop();
}
}