我真是猪脑子哇
学姐讲的全被我吃了
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;
}
关于强连通分量:
非强连通图的极大强联通子图(哪个lian通无所谓)
要用到栈
例题:
