hdu2647 Reward(拓撲排序)

2021-06-18 10:32:34 字數 1091 閱讀 5644

老闆要給很多員工發獎金, 但是部分員工有個虛偽心態, 認為自己的獎金必須比某些人高才心理平衡; 但是老闆很人道, 想滿足所有人的要求, 並且很吝嗇,想畫的錢最少

輸入若干個關係

a ba c

c b意味著a 的工資必須比b的工資高 同時a 的工資比c高; c的工資比b高

當出現環的時候輸出-1

思路: 反向建圖, 然後top排序分層次; 第一次的工資為888(最低), 第二層的工資 + 1, 後面一樣

#include #include #include #include #pragma warning(disable: 4996)

using namespace std;

const int maxv = 10003;

const int maxe = 20003;

struct graph

void addedge(int u, int v)

int top;

int head[maxv], num[maxe], next[maxe];

};graph g;

int in[maxv];

int logicaltopsort(int vexnum)

} int cengci = 0;

int res = 0;

for(int i = 1; i <= vexnum; i++)

if(s == 1 && flag)

return -1;

res += ((s - 1) * (888 + cengci));

cengci++;

for(int j = 1; j < s; j++)

}} return res;

}int main()

int ans = logicaltopsort(vexnum);

printf("%d\n", ans);

} return 0;

}

不知道為什麼不會超時, 感覺這個題目必須得用佇列優化為o(n + m); 否者為o(n * n); 優化的時候一定要注意什麼時候入隊, 否則容易多次入隊, 還有就是要注意怎麼判斷不能排序成功的條件

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

HDU 2647 Reward(拓撲排序)

題意 春節來臨給員工發工資,有n名員工,m個要求,每個要求是 a b,意思a的工資要比b多。每個員工最低工資是888.問總共發放工資的最低是多少?思路 從最低工資拓撲排序.排序的方向就是從低到高,開始方向建錯,w好幾發 最低888,依次 1,沒有要求就是統一等級。include using name...