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);
}

浙公网安备 33010602011771号