poj1062昂貴的聘禮(Dijkstra )

2022-04-04 06:53:06 字數 1435 閱讀 7824

1/*2

題意: 物主有乙個物品,價值為p,地位為l, 以及一系列的替代品ti和該替代品所對應的"優惠"vi

3g[u][i] 表示的是u物品被i物品替換後的***格!(u>0, i>0)

4g[u][0]表示不用替換該物品的實際** !

5d[0]表示的是第乙個物品經過一系列的物品替換之後的最少***格!67

思路:每當我們通過dijkstra演算法得到離源點(1)最近的距離的節點 p的時候(也就是1...pre[p], p)這條

8路徑上的物品互相替換後得到最優**,我們需要判斷是否滿足路徑上的任意兩個節點的地位差的絕對值是否

9<=m, 如果不是,那麼這條路經就廢掉了!要從新找最短路!

10*/

11 #include12 #include13 #include14 #include15

#define inf 0x3f3f3f3f

16using

namespace

std;

1718

int g[105][105

];19

20int d[105

];21

int l[105

];22

int vis[105

];23

int pre[106

];24

intm, n;

25int

minp, maxp;

2627

bool dfs(int

p)33

if(minp>l[pre[p]]) minp=l[pre[p]];

34if(maxpl[pre[p]];

35return

dfs(pre[p]);36}

3738

void

dijkstra()

54if(!vis[i] && minlen>d[i])58}

59}60 minp=maxp=l[p];

61if(p && !dfs(p))

66 j=0;//

從頭開始尋找其他的路徑!

67 root=1

;68 memset(vis, 0, sizeof

(vis));

69 vis[root]=1;70

continue;71

}72 root=p;

73 vis[root]=1;74

}75}76

7778

intmain()90}

91dijkstra();

92 printf("

%d\n

", d[0

]);93}94

return0;

95 }

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