题目
这个题还是近乎板子题吧。
tarjan求点双连通分量 , 建圆方树,路径上的圆点为必须经过的点。
那么答案就是点集中任意两点间的圆点数量,也就是在虚树上或虚树的边上的圆点数 - 虚树上的圆点数。
设点集为S,答案为按dfs序排序后:
d i s ( S 1 , S 2 ) + d i s ( S 2 , S 3 ) . . . + d i s ( S k , S 1 ) 2 − ∣ S ∣ \frac {dis(S1,S2)+dis(S2,S3)...+dis(Sk,S1)}2 - |S| 2dis(S1,S2)+dis(S2,S3)...+dis(Sk,S1)−∣S∣
AC Code:
#include<bits/stdc++.h>
#define maxn 200005
using namespace std;
int info[maxn],Prev[maxn<<1],to[maxn<<1],cnt_e;
void Node(int u,int v){
Prev[++cnt_e]=info[u],info[u]=cnt_e,to[cnt_e]=v; }
vector<