Reward(拓撲排序)

2021-07-03 15:16:55 字數 850 閱讀 5286

這一題很好,用到了拓撲排序(從後往前),由於這一題資料比較大所以用vector來儲存!

儲存過程中會出現這乙個問題!

4 31 2

2 31 4

這樣的乙個問題怎麼解決呢?

3->2>1

4->1這個問題4和3是888,2是889,那麼1是多少合適呢?

是889(大於4)還是890(大於1)呢?由題意我們知道是890

用程式怎麼判斷呢?

程式是通過佇列來實現的

你比如這個點

壓進去3 4

彈出3 壓進去 2此時佇列裡有4 2

彈出4 更新1的值為899 壓進1

彈出2 更新一的值為890

彈出1通過佇列的長度來決定更新前面乙個值得先後順序!

還可以通過佇列來判斷是否有環,出棧之後棧是否為空!

*/const int maxs=10010;

using namespace std;

vectorvec[maxs];

int indegree[maxs],money[maxs];

int n,m;

int toposort()

}while(!q.empty())

else

}int main()

for(i=1;i<=m;i++)

if(toposort())

cout<

Reward(拓撲排序)

題意 老闆要給n個員工發工資最低工資是888 但是工人們是有要求的 如果輸入 a b 表示a的工資要比b的工資高 求出老闆最少準備多少工資 1 拓撲排序 資料結構書上有 用乙個佇列來儲存入度為零的點 開始遍歷這些點 遍歷之後把以這個點開頭的邊刪除比如a到b 遍歷a時把b的度減一 2 鄰接表儲存 用v...

HDU 2647 Reward(拓撲排序)

click here 題意 老闆給員工發薪水,有的員工要求必須比某些員工薪水高。基礎薪水是888,問最少發多少薪水。解題思路 想要發的薪水最少,就要讓員工盡量只滿足要求即可,不必多發。我們可以大致想象出員工的薪水大概是一層一層分布的,即888一層,889一層,依此類推,每層有若干個員工,但一定不會為...

hdu 2647 Reward ( 拓撲排序 )

統計各結點出度,出度為0的點表示他們 a類 所需的reward為888,而reward要比他們多的 b類 則為888 1,reward要比b類多的 c類 則為888 2.其中若一開始從a類得到了b類,然後有某個b類要比另乙個b類的reward多,則該b類的reward從888 1改為888 2.以此...