无向图求割点

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxx = 1005;
int dfn[maxx],low[maxx],flag[maxx],sign[maxx];
vector<int> v[maxx];
int cnt = 0,ans = 0,root;
void tarjan(int x,int pre)
{
    int child = 0;
    flag[x] = 1;
    low[x] = dfn[x] = ++cnt;
    for(int i=0;i<v[x].size();i++){
        int now = v[x][i];
        if(!flag[now]){
            child++;
            tarjan(now , x);
            low[x] = min(low[x] , low[now]);

            if(x != root && low[x] >= dfn[x]){
                sign[x] = 1,ans++;
            }
            if(x == root && child >= 2){
                sign[x] = 1,ans++;
            }
        }
        else if(pre != now){
            low[x] = min(low[x],dfn[now]);
        }
    }
}
int main()
{
    int n,m,x,y;
    cin>>n>>m;
    memset(dfn,0,sizeof(dfn));
    memset(low,0,sizeof(low));
    memset(flag,0,sizeof(flag));
    for(int i=1;i<=m;i++){
        cin>>x>>y;
        v[x].push_back(y);
        v[y].push_back(x);
    }
    for(int i=1;i<=n;i++){
        root = i;
        if(!dfn[i])
            tarjan(i , -1);
    }
    printf("割点的个数是:%d\n",ans);

    for(int i=1;i<=n;i++){
        if(sign[i] == 1){
            cout<<i<<" ";
        }
    }
    return 0;
}
全部评论

相关推荐

求个付费实习岗位:这种就是吃满时代红利又没啥技术水平,只能靠压力学生彰显优越感的老登,别太在意了
点赞 评论 收藏
分享
代码飞升_不回私信人...:别这样贬低自己,降低预期,放平心态,跟昨天的自己比。做好自己,反而会效率更高心态更好,加油兄弟
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务