hdu 2647 Reward 拓撲排序

2021-08-22 06:14:40 字數 1065 閱讀 8523

題目大意:給你n個人,m個關係,表示a比b的獎金要多。問最少分配的獎金總數是多少。

思路:假如有這樣乙個圖:

( 箭頭表示1比2獎金要多,1比5獎金要多)

不難看出,標號3的那層都是888的獎金,標號2的那層都是889的獎金,標號1的那成是890的獎金,如果我們想要確定每個點權值的話,我們需要知道各個節點之間的全序關係,也就不難想到使用拓撲排序來做這個題,直接能夠想到的方法就是直接拆點拆邊,完成拓撲排序,如果不滿足拓撲序輸出-1.那麼如果滿足拓撲序呢?每個節點拆出來的層數來如何判斷呢?每個點權值如何判斷呢?這個時候我們其實不用一直憋牛角尖正向思維去做,我們不妨反著來考慮,反向建造圖,也就相當於在原圖中反著拆點拆邊。

我們將圖建成這樣:

這個時候度為0的點也就是分配888獎金的點,也就首先確定了一些點的點權值,接著我們拆邊拓撲,也就不難想到,如果當前點u拆邊之後使得乙個點v的度為0,辣麼這個點v的點權值也就比u的點權值多1.這個時候問題就全部解決辣.

最後處理**問題:

10000*10000的鄰接矩陣會超記憶體,我們使用鄰接表實現即可:

#include#include#includeusing namespace std;

#define maxn 200010

int head[maxn];

struct edgenode

e[maxn];

int vis[maxn];

int price[maxn];

int degree[maxn];

void add(int x,int y,int i)

int main()

while(!que.empty())

if(!toposort())

cout<

else

}return 0;

}

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

hdu2647 Reward(拓撲排序)

老闆要給很多員工發獎金,但是部分員工有個虛偽心態,認為自己的獎金必須比某些人高才心理平衡 但是老闆很人道,想滿足所有人的要求,並且很吝嗇,想畫的錢最少 輸入若干個關係 a ba c c b意味著a 的工資必須比b的工資高 同時a 的工資比c高 c的工資比b高 當出現環的時候輸出 1 思路 反向建圖,...