CCF201503 5 最小花費 一種思路

2021-09-22 10:26:37 字數 847 閱讀 5192

這道題看到網上的題解基本都用dfs,但是可能會超時。所以我想可以先用尤拉序和rmq處理一下,然後對於每一次詢問求出起點終點的lca,再把整個路徑分為從起點到lca,lca到終點兩部分處理。  

我用的python,最後只得了10分。。。說是執行錯誤。這個方法我覺得還是對的,自己弄了個比較麻煩的樣例也對了。

然後把我當時做完後做的小結貼出來:

這道題想法應該是對的,因為是最短路不變,且用n-1條路就把n個點都連通,所以是個樹的形狀。剛開始就用graph存著這個雙向路,

存完以後,人為把1作為樹的樹根,從1開始dfs,每到乙個點就把該點標記為已訪問(用visited實現),然後對於其未訪問的子節點,

把它加進改點兒子列表中(zheng_graph),並且存起ni_graph[son][father] = length,然後dfs這個兒子節點。因為樹,每個父親節

點可以有多個兒子節點,但是乙個兒子節點只有乙個父親節點,所以存乙個ni_graph。乙個樹狀的結構就建好啦。處理以後用尤拉序 rmq

可以求每兩個點的lca,然後對於詢問每一對起點和終點,求出它們的lca,然後從起點開始,從下到上直接到lca,在這期間,從起點到

起點的父親節點這一小段路,只能在起點買食物。對於以後的路徑,一段一段的分析,每一段都用之前經過的所有點的最便宜**食物乘這

段路長。到了lca以後就要分析lca到終點這一段路,因為ni_graph只儲存了終點到lca的路徑長度,所以設乙個zan,從終點到lca遍歷,

交換父親節點和兒子節點,這樣就把這一段路變成了和起點到lca那一段路一樣的處理方法,同樣也是一小段一小段的處理,每一小段都

用最便宜的食物。

初學者有很多東西可能都說錯了,見諒了。

CCF 201503 5 最小花費

簡單說下思路,由題意知輸入的資料必然構成一棵樹,所以就不用什麼判斷最短路徑了,直接遍歷節點,找到s到t的路徑,逐漸更新過程中最小的單價,一直按照最小的單價購買食物。技巧 這道題發現每兩個城市之間只有唯一一條路徑後思路就很明白了,因為題目說的n個城市有n 1條邊,所以必然構成一棵樹,一棵樹裡面任意兩個...

最小花費 Dijkstra

原題鏈結傳送門 d es crip tion description descri ptio n在n個人中,某些人的銀行賬號之間可以互相轉賬。這些人之間轉賬的手續費各不相同。給定這些人之間轉賬時需要從轉賬金額裡扣除百分之幾的手續費,請問a最少需要多少錢使得轉賬後b收到100元。i np ut inp...

砍樹最小花費

題意 有n種樹,每種樹給出高度h,砍掉每顆樹的花費c,每種樹的數量p,現在要砍掉一些樹,使得最高的樹的數量超過所有樹的一半,問最小花費。不同種類的樹高度可能相同 題解 列舉不同的高度,把高於它的樹都砍掉,然後比它矮的樹挑便宜的砍,使得該高度的樹佔所有樹的1 2 1。給樹按高度排序,首先可以用字尾和預...