題目描述
題意身為屯里第一劍士的牛牛來到訓練場裡闖關,由於過於勤奮,牛牛的寶劍的耐久度降到了 22 ,這意味著牛牛最多只能打倒兩隻怪獸,否則將會被淘汰。
訓練場的地圖可以看作一棵以 11 為根節點的樹,訓練場的終點為這棵樹的葉子結點,樹上的每個結點最多有乙隻怪獸,結點與結點間的邊上沒有怪獸。
每乙個有怪獸的結點上牛牛都需要打倒怪獸才算安全,並且牛牛一旦選定好打怪路線之後便不能走回頭路。
請問牛牛有多少種到達終點且不被淘汰的路徑。
輸入第乙個引數為 nn ,(1\leq n\leq 100,000)(1≤n≤100,000)
第二個引數為大小為 n-1n−1 的點對 (u_i, v_i)(u i,v i) 的集合,其中 (u_i, v_i)(u i,v i) 表示結點 u_iui與結點 v_ivi 之間有一條邊,1<= u_i, v_i <= n1≤u i ,v i≤n
第三個引數為大小為 n 的 0/1 序列 f ,若 f_if
i 為 00 表示i-1結點沒有怪獸,否則表示 i-1 結點有怪獸。
返回乙個整數,表示牛牛能到達終點且不被淘汰的路徑數。
示例1輸入
複製
7,[(7,2),(6,1),(5,2),(1,2),(4,6),(6,3)],[0,0,1,0,1,0,0]
輸出
4
說明
樣例中的四條路徑分別為: (1 - 2 - 7), (1 - 2 - 5) , (1 - 6 - 3), (1 - 6 - 4)
思路:樹的深度優先遍歷這道題的思路沒什麼難度,難點在於給出的是點對的集合,需要從點對中構建出二叉樹。我們可以將二叉樹看作一種特殊的圖,因為根節點確定,那麼根據所有的邊構建出乙個鄰接表,從根節點出發進行深度優先搜尋,即可以搜尋到所有的節點。而需要注意的是,在構建鄰接表的時候,會將父子的關係兩次加入到鄰接表中,遍歷的時候需要進行特別的判斷。
注:
1. 全域性開陣列可以減少引數的傳遞;
2. 在進行樹的鄰接表遍歷的時候,和圖的深度優先搜尋沒有差別,主要在向下進行搜尋的時候需要傳入當前的節點,因為子節點中也存有指向父節點的邊,需要進行剔除;
3. 這種情況下進行葉子節點的判斷,有兩種方式,一種是使用乙個變數記錄向下dfs的數量,即子節點的數量,為0的時候說明是葉子節;另一種是,當前節點鄰接表的大小為1的時候,說明是葉子節點(除非是root)。
/**
* struct point ;
*/class
solution
count =0;
dfs(1,
0,f,0)
;return count;
}void
dfs(
int cur,
int father,vector<
int>
&f,int monster)
if(son==
0)count++;}
};
牛牛打怪獸
牛牛在各個平台被各種傳奇遊戲的廣告轟炸,所以他決定去玩一玩這類的遊戲。這類遊戲掛機就可以公升級,所以牛牛每天都能變強。在第i天裡,牛牛能殺死防禦力小於等於i的怪物。但由於牛牛還要刷題,所以牛牛每天最多殺乙隻怪物。這個遊戲共有n只怪物,每只怪物的防禦力為defi 牛牛想知道最少要到第幾天才能把這n只怪...
牛客網 牛牛找工作
時間限制 2秒 空間限制 65536k 為了找到自己滿意的工作,牛牛收集了每種工作的難度和報酬。牛牛選工作的標準是在難度不超過自身能力值的情況下,牛牛選擇報酬最高的工作。在牛牛選定了自己的工作後,牛牛的小夥伴們來找牛牛幫忙選工作,牛牛依然使用自己的標 准來幫助小夥伴們。牛牛的小夥伴太多了,於是他只好...
牛客網 牛牛的數列
題目描述 牛牛現在有乙個n個數組成的數列,牛牛現在想取乙個連續的子串行,並且這個子串行還必須得滿足 最多隻改變乙個數,就可以使得這個連續的子串行是乙個嚴格上公升的子串行,牛牛想知道這個連續子串行最長的長度是多少。一開始看到這個題,總是被繞進 改變乙個數 中,就想說是不是遍歷陣列,然後每個數都嘗試改變...