社区讨论

tarjan 88pts WA 悬关

P3388【模板】割点(割顶)参与者 3已保存回复 4

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
4 条
当前快照
1 份
快照标识符
@m1lmm5hb
此快照首次捕获于
2024/09/28 12:02
去年
此快照最后确认于
2025/11/04 18:37
4 个月前
查看原帖
CPP
#include <bits/stdc++.h>

using namespace std;
int n,m,cnt,dfn[20005],rt,dn,low[20005];
bool gd[20005];
vector<int> e[20005];
void dfs(int rc,int fa)
{
    dfn[rc]=++dn;
    low[rc]=dn;
    int son=0;
    for(int i=0; i<e[rc].size(); i++)
    {
        int to=e[rc][i];
        if(to==fa)
            continue;
        if(!dfn[to])
        {
            son++;
            dfs(to,rc);
            low[rc]=min(low[rc],low[to]);
            if(low[to]>=dfn[rc] && gd[rc]==0 && rc!=fa)
                gd[rc]=1,cnt++;
        }
        else
            low[rc]=min(low[rc],low[to]);
    }
    if(son>=2 && rc==fa && !gd[rc])
        gd[rc]=1,cnt++;
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1; i<=m; i++)
    {
        int u,v;
        scanf("%d%d",&u,&v);
        e[u].push_back(v);
        e[v].push_back(u);
    }
    for(int i=1; i<=n; i++)
    {
        if(!dfn[i])
        {
            rt=i;
            dfs(i,i);
        }
    }
   printf("%d\n",cnt);
    for(int i=1; i<=n; i++)
        if(gd[i])
            printf("%d ",i);

    return 0;
}

回复

4 条回复,欢迎继续交流。

正在加载回复...