Exemple #1
0
int main() {
	/* Build graph */
	dfs_num.assign(n, DFS_WHITE);
	dfs_low.assign(n,0);
	visited.assign(n, 0);
	dfsNumberCounter = numSCC = 0;
	for (int i = 0; i < n; i++)
		if (dfs_num[i] == DFS_WHITE)
			tarjanSCC(i);
	return 0;
}
Exemple #2
0
void tarjanSCC(int u) {
	dfs_low[u] = dfs_num[u] = dfsNumberCounter++;
	S.push_back(u);
	visited[u] = 1;
	for (int j = 0; j < g[u].size(); j++) {
		int v = g[u][j];
		if (dfs_num[v] == DFS_WHITE) tarjanSCC(v);
		if (visited[v]) dfs_low[u] = min(dfs_low[u], dfs_low[v]);
	}
	if (dfs_low[u] == dfs_num[u]) {
		cout << "SCC " << ++numSCC << ":";
		while (1) {
			int v = S.back();
			S.pop_back();
			visited[v] = 0;
			cout << " " << v;
			if (u == v) break;
		}
		cout << endl;
	}
}
Exemple #3
0
void tarjanSCC(int u){
	int v;
	dfs_low[u] = dfs_num[u] = counter++;
	S.push_back(u);
	vis[u] = 1;
	for(int j=0; j<nadj[u]; j++){
		v = adj[u][j];
		if(dfs_num[v]==-1)
			tarjanSCC(v);
		if(vis[u])
			dfs_low[u] = min(dfs_low[u],dfs_low[v]);
	}
	
	if(dfs_low[u]==dfs_num[u]){
		printf("SCC %d\n",++numSCC);
		while(1){
			v = s.back(); S.pop_back(); visited[v]=0;
			printf(" %d",v);
			if(u==v) break;
		}
		printf("\n");
	}
}