HDU 2647 Reward 拓撲排序發工資

2021-09-10 10:10:08 字數 964 閱讀 1619

題目

有n個工人,有些人有要求要比別的某個人工資高,滿足這些全部要求最少發的工資,底線是888。第一行n,m 剩下的m行要求,不能滿足輸出-1;否則輸出最小發工資數。

sample input

2 11 2

2 21 2

2 1sample output

1777

-1從初始入度便為0的點到達入度減到0的點長的話。在佇列中就是最後一步導致入度減到0的,就保證 f[y] = f[x] + 1 的正確性。

a比b工資高, 應該b指向a, b在a前面,f[y]=f[x]+1,代表y的層次。隊裡面出來的元素個數cnt==n說明沒有環,則會有方案。其實有環cnt#include #include #include #define m(a,b) memset(a,b,sizeof a)

#define sdd(a,b) scanf("%d%d",&a,&b)

typedef long long ll;

using namespace std;

const int n=10000+2;

int tot,n,m;

int head[n],f[n],in[n];

struct edgeedge[n*2];

void add(int from,int to)

;head[from]=tot;

in[to]++;

}queueq;

void topo()

} while(!q.empty())}}

if(cnt==n)// 寫cnt>=n也不會錯

printf("%lld\n",sum+888*n);

else

printf("-1\n");

}int main()

tot=0;

while(!q.empty())

q.pop();

while(m--)

topo();}}

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