题目链接:HDU2460
解法:树链剖分
若原图为一棵树,则所有边都是桥。那么先建出一棵原图的生成树。
对于其余的边 ( u , v ) (u,v) (u,v) ,在生成树中找到 u u u 到 v v v 的简单路径,并将路径上的边标记为不是桥。将边的信息转移到点,可以树剖实现。每次修改后查询即可。
代码
#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
using namespace std;
struct edge{
int u,v;
edge():u(0),v(0){
}
edge(int x,int y):u(x),v(y){
}
};
vector<edge> vec;
vector<int> point[100001];
int t,n,m,q,x,y,f[100001],fa[100001],son[100001],dep[100001],siz[100001],top[100001],dfn[100001],idx,tag[400001],sum[400001];
bool check[200001];
int find(int x){
return f[x]==x?x:f[x]=find(f[x]);}
bool merge(int x,int y){
int fx=find(x),fy=find(y);if(fx==fy)return false;return f[fx]=fy,true;