POJ1062昂貴的聘禮(dijkstra)

2022-04-28 16:45:09 字數 1291 閱讀 4427

昂貴的聘禮

題目大意是說有n個物品,每個物品都有自己的**,但同時某些物品也可以由其他的(可能不止乙個)替代品,這些替代品的**比較「優惠」,問怎麼樣選取可以讓你的花費最少來購買到物品1

由於有n個物品,我們就可以把它們看作是n個點,從其他點到他的優惠關係視做邊,又因為最後總是要找到物品1,所以可以看作是從起點0,到將物品1作為終點的最小路勁。然後由於題目是說,這條路勁上不能有兩個的等級差超過m,所以我們可以列舉最小等級,將每個點視作最小等級,這樣的話就不會掉解。

又由於我們是列舉的最小等級,所以源點0到其他每個點的邊的權值就要賦值為那個點的**,降等級比最小等級要大,或者差距大於m的其他點標記為不合法(也就是不可以走),然後在從合法的路勁中找出最小花費。

1 #include2 #include3 #include

4 #include5 #include6 #include

7 #include8 #include9 #include10 #include11

using

namespace

std;

12#define max(a,b) (a > b ? a : b)

13#define min(a,b) (a < b ? a : b)

14#define mem(a) memset(a,0,sizeof(a))

15#define maxn 105

16#define inf 1000000007

1718

intprice[maxn],edge[maxn][maxn],level[maxn];

19int

vis[maxn], d[maxn];

20int

n,m,ans;

2122

void

init()

2331}32

}3334void

read()

3545 edge[0][i] =price[i];46}

47}4849

intdijkstra()

5059

return d[1];//

這裡找到的最小值是未知起點的最小值60}

6162

intmain()

6377

int now =dijkstra();

78 ans =min(ans, now);79}

80 printf("

%d\n

", ans);81}

82return0;

83 }

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...