POJ1062 昂貴的聘禮 列舉 迪傑斯特拉)

2022-02-20 17:08:46 字數 1460 閱讀 5432

description

input

輸入第一行是兩個整數m,n(1 <= n <= 100),依次表示地位等級差距限制和物品的總數。接下來按照編號從小到大依次給出了n個物品的描述。每個物品的描述開頭是三個非負整數p、l、x(x < n),依次表示該物品的**、主人的地位等級和替代品總數。接下來x行每行包括兩個整數t和v,分別表示替代品的編號和"***格"。

output

輸出最少需要的金幣數。

sample input

1 4

10000 3 2

2 8000

3 5000

1000 2 1

4 200

3000 2 1

4 200

50 2 0

sample output

5250

題目解析:

1.注意等級限制,我本來以為只有在相鄰的兩個人物中有等級的限制,其實在你需要交換的所有人都有等級的限制。

2.建圖要建有向圖,不是無向圖。

3.我們可以把本題理解為,我們要買一號物品,而乙個物品的一部分價值可以轉化為別的物品,我們通過購買別的物品和加錢來購買獲得

一號物品。所以 我們可以把需要加的錢數作為該物品到別的物品的一條邊,走過這條邊,我們要花一些錢,然後我們只需要購買現在所

在結點的物品即可。這樣就把問題轉化為最短 路問題,用dijkstra就可以了。本題還有個等級制度的問題。我們可以每次列舉乙個寬

為m的等級區間,忽略不在區間內的點,進行dijkstra。

4.需要建立乙個超級源點0來儲存到每個物品的價錢。

#include #include 

#include

#include

#define inf 0x3f3f3f3f

using

namespace

std;

int map[101][101],dis[101],v[101

];int m,n,f[101

];void dj(int l,int

r) v[

0]=1

;

for(int i=0; i<=n; i++)

while(1

)

}v[k]=1

;

if(k==1

)

return

;

for(int i=0; i<=n; i++)}}

return;}

intmain()

map[i][i]=0

; }

for(int i=1; i<=n; i++)}}

int max=inf;

for(int i=f[1]-m; i<=f[1]; i++)

cout

}return0;

}

poj 1062 昂貴的聘禮

這個題是乙個簡單的樹形dp,只是有乙個地位差限制,可以列舉可行區間,在可行區間裡進行dp.include include include include include include include include include include includeusing namespace st...

poj1062 昂貴的聘禮

做這題代價確實很昂貴,從昨天晚上一直到今天上午都在debug,今天上午提交還出現各種wa。比較明顯的最短路,有幾個地方要注意一下,首先建圖有個地方要注意以下,這題是用臨界矩陣儲存的有向圖,而且是由交換品指向購買品,然後將虛節點設為購買品的價值,最後列舉每乙個可能地位區間di求最短路,因為對於區間 c...

昂貴的聘禮(POJ1062)

這個玩了好久啊,是我第一次寫出這樣的最短路徑。還是參考了其它人的才出來,注意的有 1 是單向圖,2 把不滿足權值的提前全初始化。其實不用topo排序也可的。關鍵 void dfs int k include include include include include include includ...