HDU 2647 Reward 拓撲排序

2022-08-09 01:51:21 字數 1328 閱讀 4176

題意:輸入n和m代表n個人和m組資料,m組資料中的a和b代表a的工資要比b的工資高,底薪是(888元),問你這個老闆至少要付

多少錢給這些員工,a比b工資高就是說a的工資「至少」比b高1元,當拓撲排序出現環的時候輸出 -1 ,否則輸出老闆要給的錢數。

坑爹:用拓撲排序找到入度為0的所有的點都有著同樣的工資。

例如:1-2  3-4  這樣1和3都為889元,2和4為888元,所以老闆所付的總工資為3554元。 

解法:在每次呼叫cut函式的時候都要訪問與他相鄰的邊的點的入度,每訪問一次in[ map[ k ][ i ] ] --;我們可以在每次判斷一下當前的點(k)

的工資+1與map[ k ][ i ] 的工資的比較大小,取大的乙個放入map[ k ][ i ] 的工資裡,因為某個人可能在某條線路上工資排名可能是第二,

但在另一條線路上工資排名可能就是排第三了,根據題意,所以這個人的工資為890而不是889。

例如:

這樣的話1和2為888,3為889,4為890,5為891。

view code

1 #include2 #include3

using

namespace

std;45

const

int maxn = 10000 + 10;6

intin[maxn];

7int

used[maxn];

8int

valve[maxn];

9 vector map[maxn];

10int

n;11

12int

find_zero()

1321}22

return -1;23

}2425void cut(int

k)2635}

36map[k].clear();37}

3839

inttopology()

4052

else

5358}59

return

sum;60}

6162

intmain()

6374

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

7683

84int sum=topology();

85if(sum!=-1)86

89else

9093

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

9497}98

return0;

99 }

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 思路 反向建圖,...