社区讨论
听灌多求调
灌水区参与者 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 条回复,欢迎继续交流。
正在加载回复...