警示后人
查看原帖
警示后人
399475
_XHY20180718_楼主2023/11/16 15:19

写点双的时候:

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]);
        }
    }

考场上如果不仔细读一遍代码很难调出来。。

2023/11/16 15:19
加载中...