#include <cstdio> #include <vector> #include <stack> #include <bitset> using namespace std; #define MAX 100 #define INF 2147483647 vector<int> adjList[MAX+7], SCC[MAX+7]; int V, dfs_low[MAX+7],dfs_num[MAX+7],iterCount, cnt; bitset<MAX+7> visited; stack<int> S; void process(int u) { dfs_low[u]=dfs_num[u]=iterCount++; visited[u]=true; S.push(u); int v; for(int i=0;i<(int)adjList[u].size();i++) { v=adjList[u][i]; if(dfs_num[v]==INF) process(v); if(visited[v]) dfs_low[u]=min(dfs_low[u],dfs_low[v]); } if(dfs_low[u]!=dfs_num[u]) return; do { v=S.top(), S.pop(); SCC[cnt].push_back(v); visited[v]=false; } while(u!=v); cnt++; } void init() { iterCount=cnt=0; for(int u=0;u<=V;u++) adjList[u].clear(),SCC[u].clear(), dfs_num[u]=dfs_low[u]=INF; visited.reset(); S=stack<int>(); } int main() { for(int u=0;u<V;u++) if(dfs_num[u]==INF) process(u); return 0; }
FindSCC_Tarjan's
Subscribe to:
Posts (Atom)