1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
| #include<bits/stdc++.h> #define maxn 100007 using namespace std; int n,m,cent=1,head[maxn],low[maxn],dfn[maxn],col[maxn],t,fa[maxn][30]; int tot,dep[maxn],q; struct node{ int next,to,from,flag; }edge[maxn<<2];
void add(int u,int v){ edge[++cent]=(node){head[u],v,u,0};head[u]=cent; }
void make_dfs(int x,int dy){ dep[x]=dy; for(int i=head[x];i;i=edge[i].next){ int y=edge[i].to; if(fa[x][0]==y) continue; fa[y][0]=x; make_dfs(y,dy+1); } }
void Init(){ fa[1][0]=-1; make_dfs(1,0); for(int i=1;i<=25;i++){ for(int j=1;j<=tot;j++){ if(fa[j][i-1]<0) fa[j][i]=-1; else fa[j][i]=fa[fa[j][i-1]][i-1]; } } return ; }
int lca(int x,int y){ if(dep[x]<dep[y]) swap(x,y); for(int i=0,d=dep[x]-dep[y];d;d>>=1,i++){ if(d&1) x=fa[x][i]; } if(x==y) return x; for(int i=25;i>=0;i--){ if(fa[x][i]!=fa[y][i]){ x=fa[x][i]; y=fa[y][i]; } } return fa[x][0]; }
void Tarjan(int x,int f){ low[x]=dfn[x]=++t; for(int i=head[x];i;i=edge[i].next){ int y=edge[i].to; if(!dfn[y]){ Tarjan(y,i); low[x]=min(low[x],low[y]); if(low[y]>dfn[x]) edge[i].flag=edge[(i^1)].flag=1; }else if((i^1)!=f){ low[x]=min(low[x],dfn[y]); } } }
void dfs(int x){ col[x]=tot; for(int i=head[x];i;i=edge[i].next){ int y=edge[i].to; if(!col[y]&&!edge[i].flag) dfs(y); } }
int main(){ freopen("test.in","r",stdin); freopen("test.out","w",stdout); scanf("%d%d",&n,&m); for(int i=1,a,b;i<=m;i++){ scanf("%d%d",&a,&b); add(a,b),add(b,a); } for(int i=1;i<=n;i++){ if(!dfn[i]) Tarjan(i,-1); } for(int i=1;i<=n;i++){ if(!col[i]) ++tot,dfs(i); } memset(head,0,sizeof(head));cent=1; for(int i=2;i<=2*m+1;i++){ if(edge[i].flag){ add(col[edge[i].from],col[edge[i].to]); } } Init(); scanf("%d",&q); for(int i=1,a,b;i<=q;i++){ scanf("%d%d",&a,&b); printf("%d\n",dep[col[a]]+dep[col[b]]-2*dep[lca(col[a],col[b])]); } }
|