簡單說下思路,由題意知輸入的資料必然構成一棵樹,所以就不用什麼判斷最短路徑了,直接遍歷節點,找到s到t的路徑,逐漸更新過程中最小的單價,一直按照最小的單價購買食物。
技巧:這道題發現每兩個城市之間只有唯一一條路徑後思路就很明白了,因為題目說的n個城市有n-1條邊,所以必然構成一棵樹,一棵樹裡面任意兩個節點的路徑唯一。
所以**比較簡潔,但是效能有待優化。
#include
#include
#include
#include
using namespace std;
typedef long long ll;
const ll inf
=1e18
;const int maxn
=50010
;struct node;}
;struct c;c
(int v,ll minw):u
(v),
minw
(minw);}
;vector adj[
maxn];
bool inq[
maxn];
ll cost[
maxn];
ll minw;
ll a[
maxn]=
;queue q;
void
dfs(int s,int end)}}
}int main()
for(int i =
0;i1;i++
)for
(int i =
0;i)return0;
}
CCF201503 5 最小花費 一種思路
這道題看到網上的題解基本都用dfs,但是可能會超時。所以我想可以先用尤拉序和rmq處理一下,然後對於每一次詢問求出起點終點的lca,再把整個路徑分為從起點到lca,lca到終點兩部分處理。我用的python,最後只得了10分。說是執行錯誤。這個方法我覺得還是對的,自己弄了個比較麻煩的樣例也對了。然後...
最小花費 Dijkstra
原題鏈結傳送門 d es crip tion description descri ptio n在n個人中,某些人的銀行賬號之間可以互相轉賬。這些人之間轉賬的手續費各不相同。給定這些人之間轉賬時需要從轉賬金額裡扣除百分之幾的手續費,請問a最少需要多少錢使得轉賬後b收到100元。i np ut inp...
砍樹最小花費
題意 有n種樹,每種樹給出高度h,砍掉每顆樹的花費c,每種樹的數量p,現在要砍掉一些樹,使得最高的樹的數量超過所有樹的一半,問最小花費。不同種類的樹高度可能相同 題解 列舉不同的高度,把高於它的樹都砍掉,然後比它矮的樹挑便宜的砍,使得該高度的樹佔所有樹的1 2 1。給樹按高度排序,首先可以用字尾和預...