2021-team4-C012

从 Trac 迁移的文章

这是从旧校内 Wiki 迁移的文章,可能存在一些样式问题,您可以向 memset0 反馈。

原文章内容如下:

跟pb队合训,坐牢


补齐了割点、点双的板子:

存点写法:  注意退栈结束的时机;注意以下算法结束后1不一定是真正的割点,需要特判,但不影响求点双
void tarjan(int x) {
    dfn[x] = low[x] = ++ idx, stk[++ top] = x;
    for (int k = hd[x]; k; k = e[k].nx)
        if (not e[k].f) {
            if (not dfn[e[k].v]) {
                e[k].f = e[k ^ 1].f = 1;
                tarjan(e[k].v);
                low[x] = min(low[x], low[e[k].v]);
                if (low[e[k].v] >= dfn[x]) {
                    cut[x] = 1;
                    cnt ++;
                    up[cnt] = x;
                    while (1) {
                        int y = stk[top];
                        col[y] = cnt;
                        stk[top --] = 0;
                        if (y == e[k].v)
                            break;
                    }
                }
            }
            else
                low[x] = min(low[x], dfn[e[k].v]);
        }
}

存边写法:
Leg板子上有


·对序列删除元素递归为子问题时 考虑重标号可行性

·做不动就打表 @肉眼找dp柿子大师ypl

跟pb队合训,坐牢

补齐了割点、点双的板子:

存点写法: 注意退栈结束的时机;注意以下算法结束后1不一定是真正的割点,需要特判,但不影响求点双

void tarjan(int x) {

dfn[x] = low[x] = ++ idx, stk[++ top] = x;

for (int k = hd[x]; k; k = e[k].nx)

if (not e[k].f) {

if (not dfn[e[k].v]) {

e[k].f = e[k ^ 1].f = 1;

tarjan(e[k].v);

low[x] = min(low[x], low[e[k].v]);

if (low[e[k].v] >= dfn[x]) {

cut[x] = 1;

cnt ++;

up[cnt] = x;

while (1) {

int y = stk[top];

col[y] = cnt;

stk[top --] = 0;

if (y == e[k].v)

break;

}

}

}

else

low[x] = min(low[x], dfn[e[k].v]);

}

}

存边写法:

Leg板子上有

·对序列删除元素递归为子问题时 考虑重标号可行性

·做不动就打表 @肉眼找dp柿子大师ypl