关于Tarjan

Posted yanxiujie

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于Tarjan相关的知识,希望对你有一定的参考价值。

我真是猪脑子哇

学姐讲的全被我吃了

qwq

今天又温习了一下, 觉得还是写下来比较好

毕竟我的记忆力

犹如冬风

不仅刷刷刷的还飕飕飕的

 

关于割点与割边(桥):

割点:删它及其连边去之后图变为不连通

能够成为割点的条件: 1.对于根节点,有两棵或以上子树 2.对于非根非叶节点, 某棵子树没有指向u的祖先的回边

割边:删掉这条边之后图变为不连通

成为割边的条件:(u,v)为树边且low[v]>dfn[u]时   原因: 表示v节点只能通过该边与u相连

例题:洛谷P3388 【模板】割点(割顶)

代码:

技术图片
#include <iostream>
#include <cstdio>
#include <cstring>
#define N 100010
using namespace std;
struct node 
    int next, to;
e[N * 2];
int n, m, idx, cnt, tot;
int head[N], dfn[N], low[N];
bool cut[N];
void add (int x, int y) 
    e[++cnt].next = y;
    e[cnt].to = head[x];
    head[x] = cnt;

void tarjan (int u, int fa) 
    dfn[u] = low[u] = ++idx;
    int child = 0;
     for (int i = head[u]; i; i = e[i].to) 
         int nx = e[i].next;
         if (!dfn[nx]) 
             tarjan (nx, fa);
             low[u] = min (low[u], low[nx]);
             if (low[nx] >= dfn[u] && u != fa) 
                 cut[u] = 1;
             if (u == fa) child++;
         
        else low[u] = min (low[u], dfn[nx]);
    
    if (child >= 2 && u == fa)
        cut[u] = 1;

int main () 
    scanf ("%d%d", &n, &m);
    for (int i = 1; i <= m; i++) 
        int a, b;
        scanf ("%d%d", &a, &b);
        add (a ,b);
        add (b, a);
    
    for (int i = 1; i <= n; i++) 
        if (!dfn[i])
            tarjan (i, i);
    for (int i = 1; i <= n; i++) 
        if (cut[i])
            tot++;
    printf ("%d\n", tot);
    for (int i = 1; i <= n; i++)
        if (cut[i])
            printf ("%d ", i);
    return 0;
code

 

 

关于强连通分量:

非强连通图的极大强联通子图(哪个lian通无所谓)

要用到栈

例题:

 

以上是关于关于Tarjan的主要内容,如果未能解决你的问题,请参考以下文章

小白入门向tarjan算法+codevs1332题解报告

2-SAT问题

tarjan算法与拓扑排序

再聊面试,这次关于钱,关于培训,关于内卷

关于数学,关于年少的感动,关于初心

scrapy 关于 rule, 关于多页