vector<vector<int> > edges(105);
vector<vector<int> > graph(105);
int dfn[105], low[105];
int vis[105], in_stack[105];
int tag[105];
int src = 1, cnt = 0;
stack<int> st;
void init()
{
memset(dfn, 0, sizeof(dfn));
memset(low, 0, sizeof(low));
memset(vis, 0, sizeof(vis));
memset(tag, -1, sizeof(tag));
memset(in_stack, 0, sizeof(in_stack));
}
void tarjan(int u)
{
dfn[u] = src;
low[u] = src;
src++;
st.push(u);
vis[u] = true;
in_stack[u] = true;
for (int i = 0; i<edges[u].size(); i++)
{
int &vtx = edges[u][i];
if (!vis[vtx])
{
tarjan(vtx);
low[u] = min(low[u], low[vtx]);
}
else if (in_stack[vtx])
{
low[u] = min(low[u], dfn[vtx]);
}
}
if (dfn[u] == low[u])
{
int v = st.top();
do
{
v = st.top();
st.pop();
in_stack[v] = false;
tag[v] = cnt;
} while (u != v);
cnt++;
}
}
Tarjan - 模板
最新推荐文章于 2024-05-07 22:08:27 发布