题目:点击打开链接
思路:
#include<stdio.h>
#include<vector>
#include<cmath>
#include<string.h>
#define MAXN 10000+5
#define MAXM 100000+5
#include<stack>
using namespace std;
bool in_stack[MAXN];
bool vis[MAXN];
int low[MAXN];
int dfn[MAXN];
stack<int> s;
int cur_time,color;
int col_num[MAXN];
int n,m;
vector<int> adj[MAXN];
int tarjan(int cur)
{
dfn[cur] = low[cur] = ++cur_time;
s.push(cur);
in_stack[cur] = true;
vis[cur] = true;
for(int i = 0; i < adj[cur].size(); ++i){
int v = adj[cur][i];
if(!vis[v]){
tarjan(v);
low[cur] = min(low[v],low[cur]);
}
else if(in_stack[v]){
low[cur] = min(low[cur],dfn[v]);
}
}
if(dfn[cur] == low[cur]){
++color;
int v;
do{
v = s.top();
s.pop();
in_stack[v] = false;
++col_num[color];
}while(v