为什么代码加了一行cerr调试会导致输出不一样?
  • 板块灌水区
  • 楼主_Hugoi_
  • 当前回复11
  • 已保存回复12
  • 发布时间2024/10/11 10:19
  • 上次更新2024/10/11 14:43:51
查看原帖
为什么代码加了一行cerr调试会导致输出不一样?
525402
_Hugoi_楼主2024/10/11 10:19

rt

一下两份代码只有一行 cerr 的区别,但输出答案不一样。

#include<bits/stdc++.h>
using namespace std;
const int N=2e4+10;
int n,m,q,cnt,dfn[N],low[N],idx,st[N],top,tmp;
int siz[N],sum[N],dep[N],topf[N],mxs[N],fa[N];
vector<int> e[N],g[N];
void tarjan(int u){
    dfn[u]=low[u]=++idx;
    st[++top]=u;
    for(int i=0;i<e[u].size();i++){
        int v=e[u][i];
        if(!dfn[v]){
            tarjan(v);
            low[u]=min(low[u],low[v]);
            if(low[v]==dfn[u]){
                cnt++;
                for(int i;i!=v;){
                    i=st[top--];
                    g[cnt].push_back(i);
                    g[i].push_back(cnt);
                }
                g[cnt].push_back(u);
                g[u].push_back(cnt);
            }
            continue;
        }
        low[u]=min(low[u],dfn[v]);
    }
}
void dfs1(int u,int p){
    siz[u]=1;
    dep[u]=dep[p]+1;
    fa[u]=p;
    for(int i=0;i<g[u].size();i++){
        int v=g[u][i];
        if(v==p) continue;
        sum[v]+=sum[u];
        dfs1(v,u);
        siz[u]+=siz[v];
        if(siz[v]>siz[mxs[u]]) mxs[u]=v;
    }
}
void dfs2(int u,int tp){
    topf[u]=tp;
    if(mxs[u]) dfs2(mxs[u],tp);
    for(int i=0;i<g[u].size();i++){
        int v=g[u][i];
        if(v==fa[u]||v==mxs[u]) continue;
        dfs2(v,v);
    }
}
int lca(int x,int y){
    if(dep[topf[x]]<dep[topf[y]]) swap(x,y);
    while(topf[x]!=topf[y]){
        x=fa[topf[x]];
        if(dep[topf[x]]<dep[topf[y]]) swap(x,y);
    }
    if(dep[x]>dep[y]) swap(x,y);
    return x;
}
int main(){
#ifndef ONLINE_JUDGE
    freopen("in.in","r",stdin);
    freopen("out.out","w",stdout);
#endif
    ios::sync_with_stdio(0);
    while(1){
        cin>>n>>m;
        tmp++;
        if(!n&&!m) break;
        cnt=n;
        for(int i=1;i<=m;i++){
            int u,v;
            cin>>u>>v;
            e[u].push_back(v);
            e[v].push_back(u);
        }
        for(int i=1;i<=n;i++){
            sum[i]=1;
            if(!dfn[i]) tarjan(i);
        }
        dfs1(1,0);
        dfs2(1,1);
        cin>>q;
        while(q--){
            int x,y;
            cin>>x>>y;
            int Lca=lca(x,y);
            cout<<sum[x]+sum[y]-sum[Lca]-sum[fa[Lca]]<<'\n';
        }
        idx=top=0;
        for(int i=0;i<N;i++){
            e[i].clear();
            g[i].clear();
            dfn[i]=low[i]=st[i]=0;
            siz[i]=sum[i]=dep[i]=topf[i]=mxs[i]=fa[i]=0;
        }
    }
}
#include<bits/stdc++.h>
using namespace std;
const int N=2e4+10;
int n,m,q,cnt,dfn[N],low[N],idx,st[N],top,tmp;
int siz[N],sum[N],dep[N],topf[N],mxs[N],fa[N];
vector<int> e[N],g[N];
void tarjan(int u){
    dfn[u]=low[u]=++idx;
    st[++top]=u;
    for(int i=0;i<e[u].size();i++){
        cerr<<i<<' ';
        int v=e[u][i];
        if(!dfn[v]){
            tarjan(v);
            low[u]=min(low[u],low[v]);
            if(low[v]==dfn[u]){
                cnt++;
                for(int i;i!=v;){
                    i=st[top--];
                    g[cnt].push_back(i);
                    g[i].push_back(cnt);
                }
                g[cnt].push_back(u);
                g[u].push_back(cnt);
            }
            continue;
        }
        low[u]=min(low[u],dfn[v]);
    }
}
void dfs1(int u,int p){
    siz[u]=1;
    dep[u]=dep[p]+1;
    fa[u]=p;
    for(int i=0;i<g[u].size();i++){
        int v=g[u][i];
        if(v==p) continue;
        sum[v]+=sum[u];
        dfs1(v,u);
        siz[u]+=siz[v];
        if(siz[v]>siz[mxs[u]]) mxs[u]=v;
    }
}
void dfs2(int u,int tp){
    topf[u]=tp;
    if(mxs[u]) dfs2(mxs[u],tp);
    for(int i=0;i<g[u].size();i++){
        int v=g[u][i];
        if(v==fa[u]||v==mxs[u]) continue;
        dfs2(v,v);
    }
}
int lca(int x,int y){
    if(dep[topf[x]]<dep[topf[y]]) swap(x,y);
    while(topf[x]!=topf[y]){
        x=fa[topf[x]];
        if(dep[topf[x]]<dep[topf[y]]) swap(x,y);
    }
    if(dep[x]>dep[y]) swap(x,y);
    return x;
}
int main(){
#ifndef ONLINE_JUDGE
    freopen("in.in","r",stdin);
    freopen("ans.ans","w",stdout);
#endif
    ios::sync_with_stdio(0);
    while(1){
        cin>>n>>m;
        tmp++;
        if(!n&&!m) break;
        cnt=n;
        for(int i=1;i<=m;i++){
            int u,v;
            cin>>u>>v;
            e[u].push_back(v);
            e[v].push_back(u);
        }
        for(int i=1;i<=n;i++){
            sum[i]=1;
            if(!dfn[i]) tarjan(i);
        }
        dfs1(1,0);
        dfs2(1,1);
        cin>>q;
        while(q--){
            int x,y;
            cin>>x>>y;
            int Lca=lca(x,y);
            cout<<sum[x]+sum[y]-sum[Lca]-sum[fa[Lca]]<<'\n';
        }
        idx=top=0;
        for(int i=0;i<N;i++){
            e[i].clear();
            g[i].clear();
            dfn[i]=low[i]=st[i]=0;
            siz[i]=sum[i]=dep[i]=topf[i]=mxs[i]=fa[i]=0;
        }
    }
}
5 5
2 1
3 2
4 1
5 1
2 5
1
4 5
5 5
2 1
3 1
4 1
5 1
3 4
1
5 5
5 5
2 1
3 1
4 2
5 1
1 5
1
5 3
0 0
2024/10/11 10:19
加载中...