Percentage points:
inline void dfs(int x) { int children=0; dfn[x]=low[x]= ++m1; for(int i=link[x];i;i=a[i].next) { int y=a[i].y; if(!dfn[y]) { children++; f[y]=x; dfs(y); low[x]=min(low[x],low[y]); if(f[x]==-1&&children>=2) vis[x]=1; if(f[x]!=-1&&low[y]>=dfn[x]) vis[x]=1; } else if(f[x]!=y) low[x]=min(low[x],dfn[y]); } }
Cutting edge:
inline void dfs(int x) { dfn[x]=low[x]= ++m1; for(int i=link[x];i;i=a[i].next) { int y=a[i].y; if(!dfn[y]) { f[y]=x; dfs(y); low[x]=min(low[x],low[y]); if(low[y]>dfn[x]) { ans[++o].x=min(x,y); ans[o].y=max(x,y); } } else if(f[x]!=y) low[x]=min(low[x],dfn[y]); } }
Strongly connected components:
inline void dfs(int x) { dfn[x]=low[x]= ++m1; vis[q[++top]=x]=1; for(int i=link[x];i;i=a[i].next) { int y=a[i].y; if(!dfn[y]) { dfs(y); low[x]=min(low[x],low[y]); } else if(vis[y]) low[x]=min(low[x],dfn[y]); } if(dfn[x]==low[x]) { int k=0;o++; while(1) { if(k==x) break; k=q[top--]; ans[k]=o; vis[k]=0; } } }