poj 3159 Candies 差分約束

2022-04-14 13:31:39 字數 1107 閱讀 6808

題目:

題意:幼稚園分糖果,輸入a,b,c表示,小孩a最多只能忍受小孩b的糖果比他多c個。求第乙個小孩和最後乙個小孩最多可以相差多少個糖果。

卡佇列,spfa用佇列超時,就改成了棧 就a了。。

以下兩點題解是看了網上大神的。。。

1、問題轉換:題目所求為w[n]-w[1]的最大值,根據題目所給的一系列的約束條件w[i]-w[j]<=c,我們以孩子為結點,以c作為從j到i的有向邊的權值,

構造有向圖,此時從1到n我們可以得到多個路徑,為了使所有的孩子滿意,必須保證對於每個從1到n路徑的消耗值cost都有w[n]-w[1]<=c,

則都求最大值max(w[n]-w[1])即為min(cost),也就轉換成了最短路徑問題。

2、spfa通常是用佇列實現的,但本題使用佇列會超時,而使用棧實現則可以輕鬆挺近1000ms大關,這與spfa演算法的原理有蠻大關係,

spfa演算法的思想就是迭代更新搜尋最小值,迭代次序對於演算法的執行速度還是有一定影響的,使用棧實現spfa演算法,

會優先選擇累計鬆弛次數(就是深搜過程中從根節點到當前節點的節點數)較多的資料進行迭代,

這在很多情況下對於提高執行速度是比較有利的,這道題就是乙個很好的例證。

1 #include2 #include3 #include

4 #include5

using

namespace

std;67

const

int inf=1

<<28;8

int cnt,head[150010],d[150010],vis[150010

],n,m;

9 stackq;

1011

struct

node

12 edge[150010

];15

16void spfa(int

s)1740}

41}42}

43};

44int

main()

4561 spfa(1

);62 printf("

%d\n

",d[n]);63}

64 }

POJ 3159 Candies 差分約束

題目意思 flymouse是幼稚園班上的班長,一天老師給小朋友們買了一堆的糖果,由flymouse來分發,在班上,flymouse和snoopy是死對頭,兩人勢如水火,不能相容,因此fly希望自己分得的糖果數盡量多於 snoopy,而對於其他小朋友而言,則只希望自己得到的糖果不少於班上某某其他人就行...

POJ 3159 Candies 差分約束

poj 3159 n個點,每個點有權值p i 給出一些條件 即p j p i k,k 0。要求在滿足這些條件的情況下,求出p n p 1 的最大值。觀察最短路的性質,di st i di st j wt j,i 與p j p i k 形式很相似 di st i mi n p i m in這樣使p i...

POJ 3159 Candies 差分約束

題目連線 題意 給n個小朋友發糖,如果小朋友a發現小朋友b比他多c個糖,a就不開心。要使所有小朋友都開心,問第乙個小朋友和最後乙個小朋友獲得的糖相差最大為多少。題解 一 spfa卡佇列,用棧能過。不需要判斷負環的情況下,用棧更快,也會更省空間。include include include incl...