tarjan算法入门(1)

今天开始学习tarjan,结合的资料的是刘汝佳的训练指南和https://www.byvoid.com/blog/tag/%E5%9C%96%E8%AB%96(byvoid)

的博客,学习了1个多小时,了解tarjan算法的解决步骤和思路,但是代码还是有点问题

先把模版放上来,继续切cf,其余问题明天继续

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <stack>
using namespace std;

const int maxn = 1e5;
vector<int>g[maxn];
int pre[maxn], lowlink[maxn],sccno[maxn], dfs_clock,scc_cnt;
stack<int>s;

void dfs(int u)
{
	pre[u] = lowlink[u] == ++dfs_clock;
	s.push(u);
	int i;
	for(i = 0; i < g[u].size(); i++)
	{
		int v = g[u][i];
		if(!pre[v])
		{
			dfs(v);
			lowlink[u] = min(lowlink[u], lowlink[v]);
		}

		else if(!sccno[v])
		{
			lowlink[u] = min(lowlink[u], pre[v]);
		}
	}

	if(lowlink[u] == pre[u])
	{
		scc_cnt++;
		for(;;)
		{
			int x = s.top();
			s.pop();
			sccno[x] = scc_cnt;
			if(x == u)
				break;
		}
	}
}

void find_scc(int n)
{
	dfs_clock = scc_cnt = 0;
	memset(sccno, 0, sizeof(sccno));
	memset(pre, 0, sizeof(pre));
	int i;
	for(i = 0; i < n; i++)
		if(!pre[i])
			dfs(i); 

}

  

posted @ 2016-10-26 19:45  fzfn5049  阅读(121)  评论(0编辑  收藏  举报