蒟蒻求教,tarjan到底是low[v]>=dfn[u]还是low[v]>dfn[u]

P3388 【模板】割点(割顶)

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


|