主要題意就是先給你乙個最小生成樹然後一些附加的邊;
你要從最小生成樹里取一條邊 然後附加邊裡取一條 使 這個連通塊分成兩個連通塊;
首先來看看樣例
三種取法 是圖中的三種顏色的取法法
如果圖變成這個樣子 要使圖從 1-2這條邊 變成兩個連通塊 你會發現
1-2-4-1 是乙個環 1-2-3-4-1又是乙個環 這個時候就要去掉兩條附加邊 所以是不行的
當圖為這樣 想要找 去掉主邊4-5的時候的情況 由於 沒有存在與5有關的環
所以只要去掉4 - 5這條邊即可 其他去掉哪個附加邊都可以
這個時候用樹上差分就好了 將附加邊 的兩個點跑一次lca就可以找到 乙個公共點 把公共點當頭 公共邊上的邊都加上1 即可計算每條邊成環的次數;
#include
#include
using
namespace std;
const
int n =
1e5+
10,m =
2e5+10;
int n,m,qzh[n]
;int head[n]
,to[m <<1]
,last[m <<1]
,cnt;
void
add(
int a,
int b)
int depth[n]
,fa[n][22
],q[n]
;void
bfs()}
}}}int
lca(
int x,
int y)}if
(x == y)
return x;
for(
int k =
16; k >=
0; k--)}
return fa[x][0
];}int ans;
intdfs
(int x,
int lastt)
}return res;
}int
main()
bfs();
for(
int i =
1; i <= m; i++
)dfs(1
,0);
cout << ans << endl;
return0;
}
樹上差分的整理(點的樹上差分和邊的樹上差分)
點的樹上差分 若經過 u 到 v 的所有點,tmp u tmp v tmp lca u,v tmp parent lca u,v 0 例題 include using namespace std struct ss ss data 600010 int n,q int a 300010 head 6...
差分 樹上差分略解
差分 樹上差分略解 哈哈差分?先來看一道題 題目描述 給定包含 n個數的陣列 a1,a2,an.有 k次操作 每次操作把區間 l,r 加上v 最後求出數列每個位置的數。輸入格式 第一行,n.第二行,a1,a2,an下一行,k,下k行,每行乙個操作,格式為l,r,v 輸出格式 一行,更新後的陣列 樣例...
差分總結二 樹上差分
找這個樹上 重複經過的最多點 經過幾次 看這名字 就醉了orz 這題是 樹上差分 模板題 點差分 點差分的話 由於 lca 本身是有貢獻的 那麼d lca 用d lca父親 只要消掉影響 include using namespace std const int maxn 1e5 10 int n,...