找了篇题解和自己对拍都对不出来,两个WA掉的点都是answer Too short on line 1.
#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
#include<stack>
using namespace std;
const int N=2e4+5;
const int M=5e4+5;
int n,m,tot;
int fir[N],cnt;
int dfn[N],low[N],vis[N];
int color,belong[N];
int ex_fir[N],ex_cnt,fa[N][25],dep[N];
stack<int>s;
stack<int>emp;
struct edge
{
int v,nxt;
}e[M<<1],ex_e[M<<1];
void add(int u,int v)
{
e[++cnt].v=v;
e[cnt].nxt=fir[u];
fir[u]=cnt;
}
void ex_add(int u,int v)
{
ex_e[++ex_cnt].v=v;
ex_e[ex_cnt].nxt=ex_fir[u];
ex_fir[u]=ex_cnt;
}
void tarjan(int j,int x,int from)
{
dfn[x]=low[x]=j;
vis[x]=1;
s.push(x);
for(int i=fir[x];i!=0;i=e[i].nxt)
{
int to=e[i].v;
if(to==from)continue;
if(vis[to]==1)low[x]=min(dfn[to],low[x]);
else
{
tarjan(j+1,to,x);
low[x]=min(low[x],low[to]);
}
}
if(dfn[x]==low[x])
{
color++;
while(s.top()!=x)
{
int np=s.top();
vis[np]=0;
belong[np]=color;
s.pop();
}
belong[x]=color;
vis[x]=0;
s.pop();
}
return;
}
void dfs(int x,int from)//初始化各个节点的20级父亲
{
fa[x][0]=from;
dep[x]=dep[from]+1;
for(int i=1;i<=20;i++)
fa[x][i]=fa[fa[x][i-1]][i-1];
for(int i=ex_fir[x];i!=0;i=ex_e[i].nxt)
{
int to=ex_e[i].v;
if(to==from)continue;
dfs(to,x);
}
}
int lca(int x,int y)//倍增找lca
{
if(dep[x]<dep[y])swap(x,y);//保证x点在y点下方
if(dep[x]!=dep[y])
for(int k=20;k>=0;k--)
if(dep[fa[x][k]]>=dep[y])x=fa[x][k];
if(x==y)return x;
for(int k=20;k>=0;k--)
if(fa[x][k]!=fa[y][k])
{
x=fa[x][k];
y=fa[y][k];
}
return fa[x][0];
}
void print(int dis)
{
s=emp;
while(dis>0)
{
if(dis&1)s.push(1);
else s.push(0);
dis>>=1;
}
while(s.empty()!=1)
{
printf("%d",s.top());
s.pop();
}
printf("\n");
}
// ------以下是调试部分------
void output_tree()
{
printf("tree:\n");
for(int i=1;i<=n;i++)
{
for(int j=fir[i];j!=0;j=e[j].nxt)
printf("(%d,%d) ",i,e[j].v);
printf("\n");
}
}
void output_extree()
{
for(int i=1;i<=n;i++)
printf("belong[%d]=%d\n",i,belong[i]);
for(int i=1;i<=color;i++)
{
for(int j=ex_fir[i];j!=0;j=ex_e[j].nxt)
printf("(%d,%d) ",i,ex_e[j].v);
printf("\n");
}
}
void output_fa()
{
for(int i=1;i<=color;i++)
{
for(int j=0;j<=2;j++)
printf("fa[%d][%d]=%d ",i,j,fa[i][j]);
printf("\n");
}
}
void output_dep()
{
for(int i=1;i<=n;i++)
printf("dep[%d]=%d\n",i,dep[i]);
}
// ------以上是调试部分------
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
int u,v;
scanf("%d%d",&u,&v);
add(u,v);
add(v,u);
}
// output_tree();
tarjan(1,1,1);
// printf("after tarjan\n");
// output_tree();
for(int i=1;i<=n;i++)
{
for(int j=fir[i];j!=0;j=e[j].nxt)
{
int to=e[j].v;
// printf("j=%d,to=%d ",j,to);
// printf("belong[%d]=%d,belong[%d]=%d\n",i,belong[i],to,belong[to]);
if(belong[i]!=belong[to])
{
// printf("add edge\n");
ex_add(belong[i],belong[to]);
}
}
}
// output_extree();
dfs(1,1);
// output_dep();
// output_fa();
scanf("%d",&tot);
for(int i=1;i<=tot;i++)
{
int x,y;
scanf("%d%d",&x,&y);
int _lca=lca(belong[x],belong[y]);
int dis=dep[belong[x]]-dep[_lca]+dep[belong[y]]-dep[_lca]+1;
// printf("dis=%d\n",dis);
print(dis);
}
return 0;
}
// 10 11
// 1 5
// 5 6
// 6 8
// 8 9
// 9 10
// 8 10
// 5 2
// 4 2
// 4 3
// 3 5
// 3 7