MSN_04 @ 2024-03-25 16:55:33
rt,此题最恶心的在于有重边,故需要在原普通tarjan中加一个针对父亲访问次数的判断。下方就是个改好的代码供大家参考。
void tarjan(ll dp,ll f){
dfn[dp]=low[dp]=++tot;
star[++cnt]=dp;
vis[f]=0;
for(int i=0;i<G[dp].size();i++){
ll x=G[dp][i];
if(x==f) vis[f]++;
if(vis[f]<2&&x==f) continue;
if(dfn[x]==0){
tarjan(x,dp);
low[dp]=min(low[dp],low[x]);
}
else low[dp]=min(dfn[x],low[dp]);
}
if(dfn[dp]==low[dp]){
int x;
vector<ll> q;
q.push_back(dp);
while(x=star[cnt--]){
if(x==dp) break;
q.push_back(x);
}
cn++;//记录组数
for(int i=0;i<q.size();i++)ans[cn].push_back(q[i]);//统计答案
}
}
by MSN_04 @ 2024-03-25 16:56:45
如果不这么干,你就会喜提50分
by STARSczy @ 2024-03-25 16:59:20
orz ,感谢!!!!
by XiaoLe_MC @ 2024-03-27 20:49:10
orz!