小王子(LCA的運用)

2021-10-06 21:50:00 字數 2307 閱讀 9754

描述

輸入

第一行包含兩個整數n和m;

之後n-1行,每行包括兩個整數x和y,表示x和y之間有一條白線;

之後m行,每行包括兩個整數x和y,表示x和y之間有一條黑線。

輸出

輸出乙個整數表示炸掉一條白線和黑線使得星星被分成兩部分的方案數。

題意:

給定一顆n節點的樹,通過n-1條白邊連線,又有m條黑邊連線(不與白邊重複),現要摧毀黑白邊各一條,問有多少種方案能將這顆樹分成兩部分。

思路:一開始嘗試用了邊雙連通來做,縮點後的方案數為(邊雙連通分量數-1)*m(分量之間的邊必為白邊,如果是黑邊則黑邊之間必有白邊會構成乙個邊雙連通分量),然後對於分量內的方案,如果有一條黑邊則方案數為該分量內的白邊數,0條黑邊為白邊數×黑邊總數。然而這是不全面的,如果只切一條邊是可以用邊雙聯通來想的,但這裡是切兩條邊,切了一條邊後原邊的邊雙連通就不一定還是「原班人馬」。

從樹的角度出發在樹上的任意兩點間(不與白邊重複)增加一條黑邊(u->v),就會構成一條(u->lca(u,v)->v)的迴路這個迴路裡的任意乙個點想要脫離就需要切斷與其父節點連線的邊和這條黑邊。由此可知當乙個點受兩條黑邊影響時由於只能去掉一條所以無法脫離。當某一點沒有受到黑邊影響時只要切斷與其父節點的邊就能脫離。

對於lca的求解,採用了數鏈剖分(剛學想再熟悉一下 其他的方法還沒學)。

簡單介紹下數鏈剖分:

將乙個父節點的子結點分成兩類:重兒子,和輕兒子。(按子節點所在子樹的節點數來分,節點數最多的為重兒子)對於乙個結點它至多有乙個重兒子(若最大值有多個,則隨便選乙個即可)。重兒子間的邊構成重鏈,反之為輕鏈。重鏈上的點可以直接跳到鏈的頂端,輕鏈也可以,不過它的頂端為自己。這或許就是按子樹節點數來劃分輕重兒子的原因之一吧。使盡可能多的點可以「坐電梯」,從而達到優化時間效率的目的。

在求lca(u,v)時根據兩點鏈頂的深度來選擇哪個向上「跳」(鏈頂相同,則說明在同一條鏈上則不進入迴圈),若 u所在鏈頂的深度較v的要深,則u跳到所在鏈頂節點的父節點。

對於為什麼是按鏈頂的深度跳,我的理解是:對於u,v所在兩條不同的鏈,如果鏈頂的深度一樣,那麼說明兩者的lca還在鏈頂的上面,至少是鏈頂的父節點,所以二者隨意乙個跳就行了(一起跳應該也可以畢竟乙個跳完後新鏈頂的深度肯定比另乙個要淺下次一定是另乙個跳,但程式設計麻煩,不考慮,還是老老實實乙個乙個跳吧)。若u鏈頂的深度要深,則為了最後收斂於lca,需u跳。從lca的位置來考慮:二者的lca一定不在u所在的鏈上,而在鏈頂的上面,所以u跳,而v就不一定了因為它鏈頂的深度是小於u的,lca可能就在v所在鏈上,所以一定是鏈頂深的跳。

跳到最後,二者在同一條鏈上了,考慮輕鏈和重鏈兩種情況:

輕鏈:因為就乙個點所以lca就是兩者所在的點;

重鏈:u,v深度(跳完後的,不是原來的u,v)淺的為lca。

#include

using

namespace std;

const

int ms=

2e5+5;

struct enode

e[ms*2]

;struct tnode

t[ms]

;int head[ms]

,a[ms]

,m;long

long ans=0;

void

dfs1

(int u,

int fa)

t[u]

.son=mx;

}void

dfs2

(int u,

int top)

}int

qlca

(int x,

int y)

else

}return t[x]

.deep>t[y]

.deep?y:x;

}void

solve

(int u)

if(t[u]

.fa)

//減去連線其父節點的白邊

}void

add_edge

(int u,

int v)

; head[u]

=cnt++

; e[cnt]

=(enode)

; head[v]

=cnt++;}

intmain()

dfs1(1

,0);

dfs2(1

,0);

for(

int i=

1;i<=m;i++

)solve(1

);cout<}

若有什麼錯誤,歡迎指正^ _ ^ 。

《小王子》隨筆

當我們坐下,想要試圖去理解小王子的時候,我們可能不再是那個幼稚的小孩了。因為小王子只不過是在守護著自己的一方樂土,守護心中那最後聖潔的心田,不讓慾望將其吞噬,也珍視每一點美好。我們渴望權力,喜歡掌控。愛慕虛榮,喜歡被關注。追求物質,喜歡錢財,卻不知還能用作何處。愧疚於自己的愧疚,卻又不會為之改變。墨...

小王子讀書筆記

小王子 天文學家,當土耳其天文學家第一次在國際天文會議上論證他的發現時,沒人相信他因為他的土耳其服裝。數年後,他穿著一套雅緻的西裝又做了一番相同的論證。這次,大家附和了他的意見。土耳其天文學家的兩次不同待遇揭露了無知人們的恐外症和狹隘民族主義的危害。國王,認為自己統治一切,但徒有虛名,只會命令別人想...

《小王子》讀後感

久負盛名的一本書,讀過後不知道應如何分類,童話 寓言,似乎都不太合適。正文很短,故事甚至沒有乙個正式的結局,但是卻令人深思。當人長大後,各方面的能力越來越強,但是卻忘記了曾經的那份單純,逐步的走向盲目,為名利所累,或是跳不出某種迴圈,把內心裡那份曾經的追尋,用各種光鮮亮麗或者腌臢不堪的理由掩蓋。又有...