tarjan算法
void tarjanOne(vector<vector<int>> &links,vector<int> &marks,int u,int &time,vector<int> &DFN,vector<int> &LOW,stack<int> &Stack,set<int> &Set)
{
DFN[u] = LOW[u] = ++time;
Stack.push(u);
Set.insert(u);
int v;
for (size_t i = 0; i < links[u].size(); i++)
{
v = links[u][i];
if (!DFN[v])
{
tarjanOne(links, marks, v, time, DFN, LOW, Stack,Set);
LOW[u] = min(LOW[u],LOW[v]);
}
else if (Set.find(v) != Set.end())
{
LOW[u] = min(LOW[u],LOW[v]);
}
}
if (DFN[u] == LOW[u])
{
do
{
v = Stack.top();
Stack.pop();
Set.erase(v);
marks[v] = u;
} while (u!=v);
}
}
vector<int> tarjanAll(vector<vector<int>> &links)
{
int N = links.size();
vector<int> marks(N, -1);
for (size_t i = 0; i < N; i++)
{
if (marks[i] == -1)
{
int time = 0;
vector<int> DFN(N,0);
vector<int> LOW(N,0);
stack<int> Stack;
set<int> Set;
tarjanOne(links,marks,i,time,DFN,LOW,Stack,Set);
}
}
return marks;
}