刚学双连通分量,求条

P8436 【模板】边双连通分量

Atserckcn @ 2024-08-08 22:24:31

#include<bits/stdc++.h>
using namespace std;
const int N=5e5+5,M=2e6+5;
int n,m,u,v;
int head[N],cnt_e,low[N],dfn[N],Index;
vector<vector<int> > ans;
stack<int> st;
struct E{
    int from,to,pre;
}e[M<<1];
void add(int from,int to)
{
    e[++cnt_e].from=from;
    e[cnt_e].to=to;
    e[cnt_e].pre=head[from];
    head[from]=cnt_e;
    return;
}
void dfs(int u,int fa)
{
    low[u]=dfn[u]=++Index;
    st.push(u);
    for(int i=head[u];i;i=e[i].pre)
    {
        int v=e[i].to;
        if(v==fa) continue;
        if(!dfn[v])
        {
            dfs(v,u);
            low[u]=min(low[u],low[v]);
        }
        else
            low[u]=min(low[u],dfn[v]);
    }
    if(low[u]==dfn[u])
    {
        int t;
        vector<int> ve;
        ve.clear();
        do{
            t=st.top();st.pop();
            ve.push_back(t);
        }while(t!=u);
        ans.push_back(ve);
    }
    return;
}
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d",&u,&v);
        add(u,v);
        add(v,u);
    }
    for(int i=1;i<=n;i++)
        if(!dfn[i])
            dfs(i,0);
    printf("%d\n",ans.size());
    for(auto i:ans)
    {
        printf("%d ",i.size());
        for(auto j:i)
            printf("%d ",j);
        putchar('\n');
    }
    return 0; 
}

https://www.luogu.com.cn/record/171486803


by whdywjd @ 2024-08-08 23:21:06

图有重边(也有自环),hack:

.in:

2 2
1 2
1 2

.out

1
2 1 2

by whdywjd @ 2024-08-08 23:22:42

@20120110_linjiale 原因是 if(v==fa) continue; 这句代码可能把 u<->fa 的多条边都忽略了,但实际只应忽略一条树边。


by Atserckcn @ 2024-08-09 08:29:27

@whdywjd

好的,谢谢


by Atserckcn @ 2024-08-09 08:36:30

@whdywjd

等等,所以该怎么改


by whdywjd @ 2024-08-09 10:17:55

@20120110_linjiale

bool flag=0;
for(int i=head[u];i;i=e[i].pre)
{
    int v=e[i].to;
    if(v==fa&&!flag)
    {
        flag = 1;
        continue;
    }

这样只有当第一次检测到 v==fa 之前 flag=0,之后会将 flag 设为 1,使得再次检测到 v==fa 时不会 continue;


by Atserckcn @ 2024-08-09 10:20:09

@whdywjd

过了,谢谢大佬


by guojiahong @ 2024-08-09 21:33:45

@20120110_linjiale 巨
我完全不会


by Atserckcn @ 2024-08-09 21:35:31

@guojiahong

你是巨佬!


by guojiahong @ 2024-08-10 08:41:47

我是蒟蒻!!!!!!!!!!


|