http://noi-test.zzstep.com/contest/CH Round %2324 - 三体杯 Round %231/逃不掉的路
思路:在同一个边双连通分量内,任意两点有两条路径,如果把图按照边双来缩点,那么就形成了一棵树,问题转化为树上两点距离。
#include<bits/stdc++.h>
using namespace std;
const int maxn=100000+100;
int n,m,q;
int pre[maxn],dfs_clock,color[maxn],tot,p[maxn];
int fa[maxn][20],deep[maxn];
struct Edge{
int from,to,bridge;
};
vector<Edge> edges;
vector<int> G[maxn],T[maxn];
//G是原图,T是缩点生成的树
int findset(int x){
return x==p[x]?x:p[x]=findset(p[x]);}
void AddEdge(int a,int b)
{
edges.push_back((Edge){
a,b,0});
edges.push_back((Edge){
b,a,0});
G[a].push_back(edges.size()-2);
G[b].push_back(edges.size()-1);
}
//tarjan求桥
int dfs0(int u,int fa)
{
int lowu=pre[u]=