写点双的时候:
for(int i=head[u];i;i=egs[i].nxt){
const int v=egs[i].v;
if(v==fa)continue;
if(!dfn[v]){
tarjan(u,v),low[u]=min(low[u],low[v]);
if(low[v]>=dfn[u]){vector<int>ltk;
while(st[r+1]!=v)
ltk.push_back(st[r]),++res[st[r--]];
ltk.push_back(u);++res[u];
pdcc.push_back(ltk);
}
}else low[u]=min(low[u],dfn[v]);
}
不要写成:
for(int i=head[u];i;i=egs[i].nxt){
const int v=egs[i].v;
if(v==fa)continue;
if(!dfn[v]){
tarjan(u,v),low[u]=min(low[u],low[v]);
if(low[v]>=dfn[u]){vector<int>ltk;
while(st[r+1]!=v)
ltk.push_back(st[r]),++res[st[r--]];
ltk.push_back(u);++res[u];
pdcc.push_back(ltk);
}else low[u]=min(low[u],dfn[v]);
}
}
考场上如果不仔细读一遍代码很难调出来。。