/tarjan
struct edge{
int u , v , next;
edge(int a = 0 , int b = 0 , int c = 0){
u = a , v = b , next = c;
}
}tarjan_e[maxe];
int tarjan_low[maxn] , tarjan_dfn[maxn] , tarjan_vis[maxn] , tarjan_block[maxn] , tarjan_head[maxn];//tarjan_block值相同即属于同一个环
int tarjan_order , tarjan_b , tarjan_cnt;
stack<int> tarjan_stack;
void tarjan_add(int u , int v){
tarjan_e[tarjan_cnt] = edge(u , v , tarjan_head[u]);
tarjan_head[u] = tarjan_cnt++;
}
void tarjan_init(){
for(int i = 0; i < maxn; i++){
tarjan_low[i] = 0;
tarjan_dfn[i] = 0;
tarjan_vis[i] = 0;
tarjan_block[i] = 0;
tarjan_head[i] = -1;
}
tarjan_b = 1;
tarjan_order = 1;
tarjan_cnt = 0;
while(!tarjan_stack.empty()) tarjan_stack.pop();
}
void tarjan(int u){
tarjan_low[u] = tarjan_order;
tarjan_dfn[u] = tarjan_order++;
tarjan_vis[u] = 1;
tarjan_stack.push(u);
for(int i = tarjan_head[u]; i != -1; i = tarjan_e[i].next){
int v = tarjan_e[i].v;
if(!tarjan_dfn[v]){
tarjan(v);
tarjan_low[u] = min(tarjan_low[u] , tarjan_low[v]);
}else if(tarjan_vis[v]) tarjan_low[u] = min(tarjan_low[u] , tarjan_dfn[v]);
}
if(tarjan_low[u] == tarjan_dfn[u]){
int top;
do{
top = tarjan_stack.top();
tarjan_stack.pop();
tarjan_vis[top] = 0;
tarjan_block[top] = tarjan_b;
}while(top != u);
tarjan_b++;
}
}
/
tarjan模板
最新推荐文章于 2024-07-05 17:18:08 发布