社区讨论

听灌多求调

灌水区参与者 5已保存回复 9

讨论操作

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

当前回复
9 条
当前快照
1 份
快照标识符
@m2dcs9ya
此快照首次捕获于
2024/10/17 21:45
去年
此快照最后确认于
2025/11/04 16:58
4 个月前
查看原帖
P3388
CPP
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e4+10;
struct edge{
    int ed,next;
}b[N];
int nbs[N],tot=0,dfn[N],low[N],t,root,cnt=0;
bool gd[N];
void add(int x,int y){
    tot++;
    b[tot].next=nbs[x];
    b[tot].ed=y;
    nbs[x]=tot;
}
void tarjan(int k){
    low[k]=dfn[k]=++t;
    int son=0;
    for(int x=nbs[k];x;x=b[x].next){
        int u=b[x].ed;
        if(!dfn[u]){
            son++;
            tarjan(u);
            low[k]=min(low[k],low[u]);
            if(low[u]>=dfn[k] && k!=root && !gd[u]){
                cnt++;
                gd[u]=1;
            }
        }else{
            low[k]=min(low[k],dfn[u]);
        }
    }
    if(son>=2 && k==root && !gd[k]){
        cnt++;
        gd[k]=1;
    }
}

int main(){
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=m;i++){
        int x,y;
        cin>>x>>y;
        add(x,y);add(y,x);
    }
    for(int i=1;i<=n;i++){
        if(!dfn[i]){
            root=i;
            tarjan(i);
        }
    }
    cout<<cnt<<endl;
    for(int i=1;i<=n;i++){
        if(gd[i]){
            cout<<i<<" ";
        }
    }
    return 0;
}


回复

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

正在加载回复...