1. 程式人生 > 其它 >CF1006E - Military Problem(搜尋技術+圖論+樹/省選級)

CF1006E - Military Problem(搜尋技術+圖論+樹/省選級)

【2021.12.15】隊內賽第三題 【2021.12.21】補題

CF1006E - Military Problem(源地址自⇔CF1006E

目錄

Problem

tag

⇔搜尋技術、⇔圖論、⇔樹、⇔省選級(*1600)

題意

軍隊傳遞訊息依照某種規律,如下:

  • 訊息的傳遞總是以樹的形式,從上級層層下傳,傳遞到下級。
  • 對於同一級的人員,編號越小的士兵越早被傳遞訊息。

現在,某個上級 \(u\) 試圖將訊息傳遞到他的第 \(v\) 個下級處,請你判斷這個下級是誰。

思路

(朱老師)

非常簡單的樹形搜尋。


(隊內賽自己)

建樹,然後使用搜索技術得出這棵樹的DFS序和每個士兵的下級數量。

  • 先判斷第 \(v\) 個下級是否存在(與子節點數量比較)。
  • 若存在,在DFS序中找到 \(u\) ,那麼 \(u\) 之後的第 \(v-1\) 個士兵即為答案。

AC程式碼(虛擬碼)

void dfs(int x) {
    a[++ m] = x;//a陣列儲存DFS序
    flag[x] = m;
    siz[x] = 1;//子節點統計陣列(包含它自己)
    For(i, V[x]) {
    	dfs(i);
    	siz[x] += siz[i];
    }
}

void solve() {
	cin >> n >> q;
	FOR(i, 2, n) {
		cin >> x;
		V[x].push_back(i);
	}
	dfs(1);
	FOR(i, 1, q) {
		cin >> x >> y;
		if(siz[x] < y)
			P(-1);
		else
			P(a[flag[x] + y - 1]);
	}
}

錯誤次數

(隊內賽1、2,補題1)誤以為DFS序的第 \(u\) 個元素就是上級 \(u\) ,導致直接計算。


文 / WIDA
2021.12.21 成文
首發於WIDA個人部落格,僅供學習討論


更新日記:
2021.12.21 成文