傳說中的暗之連鎖被人們稱為 dark。
dark 是人類內心的黑暗的產物,古今中外的勇者們都試圖打倒它。
經過研究,你發現 dark 呈現無向圖的結構,圖中有 n 個節點和兩類邊,一類邊被稱為主要邊,而另一類被稱為附加邊。
dark 有 n – 1 條主要邊,並且 dark 的任意兩個節點之間都存在一條只由主要邊構成的路徑。
另外,dark 還有 m 條附加邊。
你的任務是把 dark 斬為不連通的兩部分。
一開始 dark 的附加邊都處於無敵狀態,你只能選擇一條主要邊切斷。
一旦你切斷了一條主要邊,dark 就會進入防禦模式,主要邊會變為無敵的而附加邊可以被切斷。
但是你的能力只能再切斷 dark 的一條附加邊。
現在你想要知道,一共有多少種方案可以擊敗 dark。
注意,就算你第一步切斷主要邊之後就已經把 dark 斬為兩截,你也需要切斷一條附加邊才算擊敗了 dark。
輸入格式
第一行包含兩個整數 n 和 m。
之後 n – 1 行,每行包括兩個整數 a 和 b,表示 a 和 b 之間有一條主要邊。
之後 m 行以同樣的格式給出附加邊。
輸出格式
輸出乙個整數表示答案。
資料範圍
n
≤100000,m
≤200000,數
據保證答
案不超過
231−1
n≤100000,m≤200000,資料保證答案不超過2^−1
n≤1000
00,m
≤200
000,
資料保證
答案不超
過231
−1輸入樣例:
4 11 2
2 31 4
3 4輸出樣例:
3提公升很大的一道題,這道題首先讀題想了很久,我們有哪些情況呢?首先我們當樹上樹邊和非樹邊構成乙個環的時候樹邊需要加1,這個1代表的是我們把這個邊砍掉後還需要砍1條和這個環構成的非樹邊才能形成一種方案,如果樹邊大於等於2那麼我們是沒辦法的,如果這個樹邊是0,那麼我們只要砍掉他再隨便砍一條非樹邊都是可以的。所以我們怎麼快速給樹邊加1成了關鍵,這裡就用到了樹上差分了。最後dfs求字首和就行了再判斷當前邊的差分值就可以了。
#include
using
namespace std;
const
int n=
5e5+7;
int fa[n][17
],ne[n]
,e[n]
,w[n]
,head[n]
;int n,m,d[n]
,depth[n]
;int res,cnt;
void
add(
int a,
int b)
void
bfs()}
}}}int
lca(
int a,
int b)
if(a==b)
return a;
for(
int i=
16;i>=
0;i--)}
return fa[a][0
];}int
dfs(
int u,
int fa)
return sum;
}int
main()
bfs();
for(
int i=
1;i<=m;i++
)dfs(1
,-1)
;printf
("%d\n"
,res)
;}
暗 鎖 樹上LCA 樹上差分
傳說中的暗之連鎖被人們稱為 dark。dark 是人類內心的黑暗的產物,古今中外的勇者們都試圖打倒它。經過研究,你發現 dark 呈現無向圖的結構,圖中有 n 個節點和兩類邊,一類邊被稱為主要邊,而另一類被稱為附加邊。dark 有 n 1 條主要邊,並且 dark 的任意兩個節點之間都存在一條只由主...
樹上差分的整理(點的樹上差分和邊的樹上差分)
點的樹上差分 若經過 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 輸出格式 一行,更新後的陣列 樣例...