又写了一遍,发出来做个记录
#include#include #include using namespace std;#define N 500001int tot=1,front[N],to[N<<2],nxt[N<<2];int id,dfn[N],low[N];int fa[N],dep[N];int dp[N];int tmp[N],q[N];int ans;void read(int &x){ x=0; char c=getchar(); while(!isdigit(c)) c=getchar(); while(isdigit(c)) { x=x*10+c-'0'; c=getchar(); }}void add(int u,int v){ to[++tot]=v; nxt[tot]=front[u]; front[u]=tot; to[++tot]=u; nxt[tot]=front[v]; front[v]=tot;}void circle(int x,int y){ int cnt=dep[y]-dep[x]+1; int now=y; while(dfn[fa[now]]>=dfn[x]) tmp[cnt--]=now,now=fa[now]; tmp[cnt]=now; cnt=dep[y]-dep[x]+1; int nn=cnt; for(int i=1;i<=cnt;++i) tmp[++nn]=tmp[i]; int h=0,t=0; for(int i=1;i<=nn;++i) { while(h cnt/2) h++; if(h dp[tmp[q[t-1]]]-q[t-1]) t--; q[t++]=i; } for(int i=2;i<=cnt;++i) dp[x]=max(dp[x],dp[tmp[i]]+min(i-1,cnt-i+1));}void tarjan(int x,int y){ dfn[x]=low[x]=++id; int t; for(int i=front[x];i;i=nxt[i]) { if(i==(y^1)) continue; t=to[i]; if(!dfn[t]) { fa[t]=x; dep[t]=dep[x]+1; tarjan(t,i); low[x]=min(low[x],low[t]); } else low[x]=min(low[x],dfn[t]); if(dfn[x]