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