圆方树:https://www.cnblogs.com/cjyyb/p/9098400.html
1.点双连通分量
找到了一个新的不错的模板
void dfs(int x,int y) { dfn[x]=low[x]=++cnt; int ch=0; for (rint u=head[x];u;u=e[u].a) { int v=e[u].b; if (v==y) continue; if (!dfn[v]) { st[++top2]=v; dfs(v,x); if (low[v]>=dfn[x]) { iscut[x]=1; bcc[++cnt3].clear(); do{ bcc[cnt3].push_back(st[top2]); }while (st[top2--]!=v); bcc[cnt3].push_back(x); } if (low[v]<low[x]) low[x]=low[v]; } if (dfn[v]<low[x]) low[x]=dfn[v]; } if (x==1&&ch<=1) iscut[1]=0; }
缩点双的缩法是 把除割点以外的点双缩一起,割点单独
(好像这个东西就是圆方树。。。)
2.边双连通分量
3.强连通分量
4.仙人掌图找环
void find(ll x,ll y) { do { st1[++top]=x; st2[top]=faqz[x]; belong[x]=1; if (x==y) break; x=fa[x]; }while (1); } void dfs(ll x,ll y) { dfn[x]=low[x]=++cnt; fa[x]=y; for (rint u=head[x];u;u=e[u].a) { rint v=e[u].b; if (v==y) continue; faqz[v]=e[u].c; if (!dfn[v]) dfs(v,x); if (dfn[v]<dfn[x]) { find(x,v); } } }
这么写就可以啦 很简单
5.判断一张图是不是仙人掌
无向图:poj 2793
扫描二维码关注公众号,回复:
3618302 查看本文章
有向图:hdu 3594
6.造一张仙人掌图