903. 昂贵的聘礼题解(建图挺有趣的)
年輕的探險家來到了一個印第安部落里。在那里他和酋長的女兒相愛了,于是便向酋長去求親。酋長要他用 10000 個金幣作為聘禮才答應把女兒嫁給他。探險家拿不出這么多金幣,便請求酋長降低要求。酋長說:”嗯,如果你能夠替我弄到大祭司的皮襖,我可以只要 8000 金幣。如果你能夠弄來他的水晶球,那么只要 5000 金幣就行了。”探險家就跑到大祭司那里,向他要求皮襖或水晶球,大祭司要他用金幣來換,或者替他弄來其他的東西,他可以降低價格。探險家于是又跑到其他地方,其他人也提出了類似的要求,或者直接用金幣換,或者找到其他東西就可以降低價格。不過探險家沒必要用多樣東西去換一樣東西,因為不會得到更低的價格。探險家現在很需要你的幫忙,讓他用最少的金幣娶到自己的心上人。另外他要告訴你的是,在這個部落里,等級觀念十分森嚴。地位差距超過一定限制的兩個人之間不會進行任何形式的直接接觸,包括交易。他是一個外來人,所以可以不受這些限制。但是如果他和某個地位較低的人進行了交易,地位較高的的人不會再和他交易,他們認為這樣等于是間接接觸,反過來也一樣。因此你需要在考慮所有的情況以后給他提供一個最好的方案。為了方便起見,我們把所有的物品從 1 開始進行編號,酋長的允諾也看作一個物品,并且編號總是 1。每個物品都有對應的價格 P P P,主人的地位等級 L L L,以及一系列的替代品 T i Ti Ti 和該替代品所對應的”優惠” V i Vi Vi。如果兩人地位等級差距超過了 M M M,就不能”間接交易”。你必須根據這些數據來計算出探險家最少需要多少金幣才能娶到酋長的女兒。
輸入格式
輸入第一行是兩個整數 M M M, N N N,依次表示地位等級差距限制和物品的總數。
接下來按照編號從小到大依次給出了 N N N 個物品的描述。
每個物品的描述開頭是三個非負整數 P P P、 L L L、 X X X,依次表示該物品的價格、主人的地位等級和替代品總數。
接下來 X 行每行包括兩個整數 T T T 和 V V V,分別表示替代品的編號和”優惠價格”。
輸出格式
輸出最少需要的金幣數。
數據范圍
1 ≤ N ≤ 100 1≤N≤100 1≤N≤100,
1 ≤ P ≤ 10000 1≤P≤10000 1≤P≤10000,
1 ≤ L , M ≤ N 1≤L,M≤N 1≤L,M≤N,
0 ≤ X < N 0≤X<N 0≤X<N
輸入格式
1 4
10000 3 2
2 8000
3 5000
1000 2 1
4 200
3000 2 1
4 200
50 2 0
輸出格式
5250
咳咳,本蒟蒻深夜做題,最短路剛剛入門(感覺這題還是挺有意思的),因此寫這題時還是有很多感觸的(從acwing上搬題,排版不好看,見諒)
解題思路
- 題意:首先,我們先來看題意,這是一道最短路(牽線 )題,題意就是說一個旅行家要娶酋長的女兒,然后酋長要求他給足夠的金幣,或者用不同的物品可以使金幣優惠(只能用一件物品),然后旅行家可不是就得找物品的主人要嗎,物品的主人可好,一樣的要求,可以以物抵物,也可以用金幣購物,然后如此迭代,假設娶酋長的女兒為1號物品,后面的以此類推,共有n個物品,然后每個物品會給出它的替代品(即用這個替代品加優惠的金幣可以交換這個物品),問旅行家最少能用多少金幣取到酋長的女兒(不得不說,結個婚真難 ),接下來,我們不妨先模擬一下樣例。( l e le le代表等級, i d id id代表編號)如下圖
這張圖很好的描繪了各個物品之間的關系,但是此時我們忽略了一個問題,所有的物品我們都可以直接用金幣解決的,所以,對于每個點,我們發現都多出來一條邊,邊權是物品本身的價格,如下圖:
將這個源點 S S S定義成虛擬源點,從虛擬源點可以引出 n n n條邊,連向 n n n個點,每條邊的邊權是每個點對應的價格,于是樣例各個物品間的關系都確定了,那么這道題就可以轉化成從虛擬源點 S S S到1號點之間的最短路徑,完成建圖后,這題就轉化成了最短路問題了。 - 思路:我來看一下數據范圍, N N N是100數量級的,看地位等級差距限制也是100數量級的,我們來考慮一下各個算法的時間復雜度,樸素版 D i j k s t r a Dijkstra Dijkstra時間復雜度是 O ( n 2 ) O(n^2) O(n2),由于有地位等級限制(我們之前并沒有考慮這一點),所以我們必須保證每次交易的等級 l e v e l [ i ] level[i] level[i]滿足 ∣ l e v e l [ 1 ] ? m ∣ ≤ l e v e l [ i ] ≤ ∣ l e v e l [ i ] + m ∣ |level[1]-m|≤level[i]≤|level[i]+m| ∣level[1]?m∣≤level[i]≤∣level[i]+m∣,(這樣我們才能保證最后能跟1號點交換物品),所以我們可以跑 m m m+1次 D i j k s t r a Dijkstra Dijkstra,那么時間復雜度就是 O ( n 2 m ) O(n^2m) O(n2m),完全合理,不會超時,再看堆優化版的 D i j k s t r a Dijkstra Dijkstra,邊數是 n 2 n^2 n2級別的,所以最后總的時間復雜度是 O ( n 3 l o g n ) O(n^3logn) O(n3logn),也沒問題,再看 S P F A SPFA SPFA,正常情況下 S P F A SPFA SPFA的復雜度是 O ( m ) O(m) O(m),最壞情況不會超過 O ( n 3 ) ) O(n^3)) O(n3))(本題邊數是點數的平方),所以總的復雜度可能達到 O ( n 4 ) O(n^4) O(n4),但大部分情況是 O ( n 3 ) O(n^3) O(n3),所以我們也可以試一試,再看 F l o y d Floyd Floyd,時間復雜度妥妥的 O ( n 4 ) O(n^4) O(n4),所以大概率會 T L E TLE TLE,因此我們就不用 F l o y d Floyd Floyd了(其實我也不會用 F l o y d Floyd Floyd寫這題,輕點罵 )
代碼
廢話說了那么多,最后還是上代碼~~~
- 樸素版 D i j k s t r a Dijkstra Dijkstra
- 堆優化版的 D i j k s t r a Dijkstra Dijkstra
- 最后是我最喜歡的 S P F A SPFA SPFA(隔壁學校佬說是因為你沒被卡過才最喜歡,嘶~ )
如果真有能看到這里的大佬,本蒟蒻真的十分感謝,因為也沒怎么寫過題解,如有錯誤,請大佬多多包涵(doge)(/拜謝//拜謝//拜謝/)!
總結
以上是生活随笔為你收集整理的903. 昂贵的聘礼题解(建图挺有趣的)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信H5页面用Html2canvas生成
- 下一篇: 类似手机html框架,GitHub -