题目:求割点数量

题面:给定一个无向图,求其割点数量。割点是指一个节点,它是一个根节点且有多个子树。

思路:使用Tarjan算法求割点数量。首先,需要定义一个模板题目。然后,根据题目要求编写代码。

代码如下:

```cpp

#include

#include

#include

using namespace std;

const int MAXN = 100005;

int tot, head[MAXN], dfn[MAXN], low[MAXN], cntt, ans, vis[MAXN];

struct node {

int to, nxt;

} a[MAXN << 1];

void tarjin(int k) {

dfn[k] = low[k] = ++tot;

st.push(k);

cntt = 0;

for (int i = head[k]; i; i = a[i].nxt) {

if (!dfn[a[i].to]) {

cntt++;

tarjin(a[i].to);

low[k] = min(low[k], low[a[i].to]);

if ((rt == k && cntt > 1) || (rt != k && low[a[i].to] >= dfn[k])) {

ans += (1 - vis[k]);

vis[k] = 1;

}

} else

low[k] = min(low[k], dfn[a[i].to]);

}

}

void add(int x, int y) {

a[++tot].to = y;

a[tot].nxt = head[x];

head[x] = tot;

}

int main() {

int x, y;

scanf("%d", &x);

while (x--) {

while (getchar() != '

') scanf("%d", &y), add(x, y), add(y, x);

scanf("%d", &x);

}

tarjin(1);

printf("%d\n", ans);

return 0;

}

```

```cpp

#include

using namespace std;

int n, x, y, ans, rt;

int cnt, head[105];

int dfn[105], low[105], num, tot;

bool vis[105];

struct node {

int to, nxt;

} a[10005];

void add(int x, int y) {

a[++cnt].to = y, a[cnt].nxt = head[x], head[x] = cnt;

}

stack st;

void tarjin(int k) {

dfn[k] = low[k] = ++tot, st.push(k);

int cntt = 0;

for (int i = head[k]; i; i = a[i].nxt)

if (!dfn[a[i].to]) {

cntt++, tarjin(a[i].to), low[k] = min(low[k], low[a[i].to]);

if (((rt == k && cntt > 1) || (rt != k && low[a[i].to] >= dfn[k])))

ans += (1 - vis[k]), vis[k] = 1;

} else low[k] = min(low[k], dfn[a[i].to]);

}

int main() {

scanf("%d", &n);

while (n) {

memset(dfn, 0, sizeof(dfn)), memset(low, 0, sizeof(low)), memset(head, 0, sizeof(head));

scanf("%d", &x), ans = num = tot = cnt = 0, memset(vis, 0, sizeof(vis));

while (x) {

while (getchar() != '

') scanf("%d", &y), add(x, y), add(y, x);

scanf("%d", &x);

}

for (int i = 1; i <= n; i++)

if (!dfn[i]) rt = i, tarjin(i);

printf("%d\n", ans);

scanf("%d", &n);

}

return 0;

}

```

小结:

这道题是求割点的模板,加上输入、清空、判重等操作。整体来说,题目并不复杂,欢迎大家私信交流。

别忘了点赞和关注哦!谢谢!