AC代码:
```cpp
#include<cstdio>
#include<algorithm>
using namespace std;
const int N = 1e5;
struct Edge{int v,nxt;} e[(N<<1)+2];
int dfn[N+2],low[N+2],sta[N+2];
int fe[N+2];
int fa[N+2];
bool ins[N+2],vis[N+2],f[N+2];
int n,m,cnt,tp;
void addedge(int u,int v)
{
m++; e[m].v = v; e[m].nxt = fe[u]; fe[u] = m;
}
void Tarjan(int u)
{
cnt++; dfn[u] = cnt; low[u] = dfn[u]; tp++; sta[tp] = u; vis[u] = true;
int cn = 0;
for(int i=fe[u]; i; i=e[i].nxt)
{
int v = e[i].v;
if(!vis[v])
{
cn++; fa[v] = u;
Tarjan(v);
low[u] = min(low[u],low[v]);
if(fa[u]==0 && cn>=2) f[u] = true;
else if(fa[u]!=0 && low[v]>dfn[u]) f[u] = true; //个人认为此处应该是low[v]>=dfn[u]
}
else if(v!=fa[u])
{
low[u] = min(low[u],dfn[v]);
}
}
}
int main()
{
int m0;
scanf("%d%d",&n,&m0); m = 0;
for(int i=1; i<=m0; i++) {int x,y; scanf("%d%d",&x,&y); addedge(x,y); addedge(y,x);} cnt = 0;
for(int i=1; i<=n; i++) {if(!dfn[i]) Tarjan(i);}
int p = 0; for(int i=1; i<=n; i++) {if(f[i]) p++;}
printf("%d\n",p); for(int i=1; i<=n; i++) {if(f[i]) printf("%d ",i);}
return 0;
}
/*
6 7
1 3
3 6
6 5
5 4
4 3
3 2
2 1
*/
```
by suncongbo @ 2018-11-07 17:32:37
@[suncongbo](/space/show?uid=23613) 桥>,割点>=
by Juanzhang @ 2018-11-07 17:34:00
@[小光](/space/show?uid=73934) 好吧,谢谢
(这可能说明这题数据确实很水)
by suncongbo @ 2018-11-08 09:42:46
>= 自己在环里也是个割点
by LonelinessMan @ 2018-11-25 15:18:34
其实“==”也能过
by Melantha @ 2018-12-15 16:50:11