社区讨论
保龄求助
P3388【模板】割点(割顶)参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @locvfbbo
- 此快照首次捕获于
- 2023/10/30 20:23 2 年前
- 此快照最后确认于
- 2023/11/05 06:54 2 年前
CPP
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 21234
using namespace std;
struct Edge {
int to,head;
} edge[10*N];
int dfn[N],low[N],cnt[N],ord,stk[N],ned,tot,ifs[N],vis[N],gd[N],n,m,u,v,ans;
void add(int u,int v) {
edge[++ned].to=v;
edge[ned].head=cnt[u];
cnt[u]=ned;
}
void Empty() {
memset(gd,0,sizeof(gd));
memset(dfn,0,sizeof(dfn));
memset(low,0,sizeof(low));
memset(stk,0,sizeof(stk));
memset(cnt,0,sizeof(cnt));
memset(ifs,0,sizeof(ifs));
memset(vis,0,sizeof(vis));
memset(edge,0,sizeof(edge));
ans=ned=ord=tot=0;
}
void Tarjan(int u,int fa) {
int chi=0;
dfn[u]=low[u]=++ord;
stk[++tot]=u;
vis[u]=ifs[u]=1;
for (int i=cnt[u]; i; i=edge[i].head) {
int v=edge[i].to;
if (!vis[v]) {
++chi;
Tarjan(v,fa);
low[u]=min(low[u],low[v]);
} else if (ifs[v]) {
low[u]=min(low[u],dfn[v]);
}
}
if (chi>=2&&u==fa) gd[++ans]=u;
else if (low[u]==dfn[u]) {
int v=stk[tot];
while (v!=u) {
ifs[v]=0;
v=stk[--tot];
}
gd[++ans]=u;
}
}
int main() {
Empty();
scanf("%d%d",&n,&m);
for (int i=1; i<=m; ++i) {
scanf("%d%d",&u,&v);
add(u,v);
add(v,u);
}
for (int i=1; i<=n; ++i)
if (!vis[i]) Tarjan(i,i);
sort(gd+1,gd+ans+1);
printf("%d\n",ans);
for (int i=1; i<=ans; ++i)
printf("%d ",gd[i]);
return 0;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...