Tarjan 0 pts 求调

P8436 【模板】边双连通分量

SilverLi @ 2023-05-31 21:20:59

红绿相间

#include <bits/stdc++.h>
using namespace std;
const int N=2e6+5;
int n,m;
int cxt,h[N];
struct node {int v,nxt;}a[N];
inline void add(int u,int v) {
    a[++cxt].v=v,
    a[cxt].nxt=h[u],
    h[u]=cxt;
}
int t[N];
int cnt,dfn[N],low[N];
void tarjan(int u,int edge) {
    dfn[u]=++cnt,low[u]=cnt;
    for(int l=h[u];l;l=a[l].nxt) {
        int i=a[l].v;
        if(!dfn[i]) {
            tarjan(i,l);
            low[u]=min(low[u],low[i]);
            if(dfn[u]<low[i])   t[l]=t[l^1]=1;
        }// edge^1: u所在边的另一端点的边
        else if(l!=(edge^1))   low[u]=min(low[u],dfn[i]);
    }
}
int anss,vis[N];
vector<int> ans[N];
void dfs(int u) {
    vis[u]=1;
    ans[anss].push_back(u);
    for(int l=h[u];l;l=a[l].nxt) {
        int i=a[l].v;
        if(!vis[i]&&!t[i])  dfs(i);
    }
}
signed main() {
    cin>>n>>m;
    for(int i=1;i<=m;++i) {
        int u,v;
        cin>>u>>v;
        if(u==v)    continue;
        add(u,v),add(v,u);
    }
    for(int i=1;i<=n;++i)
        if(!dfn[i]) tarjan(i,0);
    for(int i=1;i<=n;++i)
        if(!vis[i]) ++anss,dfs(i);
    cout<<anss<<'\n';
    for(int i=1;i<=anss;++i) {
        cout<<ans[i].size()<<' ';
        for(int j:ans[i])   cout<<j<<' ';
        cout<<'\n';
    }
    return 0;
}

by tang_mx @ 2023-05-31 21:24:50

cxt没赋初值吧,cxt应该赋值为1,不然i^1的时候会出错


by tang_mx @ 2023-05-31 21:32:13

好吧,好像不止这里有问题


|