題意:有個工廠的老闆給工人發獎金,每人基礎都是888,工人們有自己的想法,如:a 工人想要比 b 工人的獎金高,老闆想要使花的錢最少 那麼就可以 給b 888,給a 889 ,但是如果在此基礎上,b也想比a高,那麼就不能讓他們滿意,輸出 -1;
分析,根據題意可以得出乙個拓撲的關係,比如 一組資料:
4 41 2
1 32 4
3 4那麼有如圖關係:(位於上層的要求比下層的高)
在這裡我用的是反向建邊,那麼建立之後 對於上案例如圖:
上馬:
// 31ms 476k
#include#include#define max 10005
struct node
edge[max*2];
int head[max];
void add(int a,int b,int tol)
int n,m;
int indegree[max];
int temp[max];//記錄臨時入度為0點,也就是分析中的在同一層次同一要求獎金額的工人
int topu()
if(tol==0) return -1;//沒有找到就是形成了環,達不到要求
ans += rw*tol; rw ++; //這一次入度為0的點數 * 此層的要求獎勵額
for(j=0;j
HDU 2647拓撲排序
還有乙個地方需要注意 判斷輸出 1的情況不能只判斷沒有乙個入度為0的點,因為有可能在中間就出現矛盾了,如 a b c d c 有入度為0的點,但卻要輸出 1 include include include includeusing namespace std define max 10005 int...
hdu 2647 拓撲排序
題意 就是後面的人必須比前面的人領的前多1,每個人至少888,問要總共要多少錢。思路 裸的的拓撲排序,因為是佇列,層數是一層一層遞進的,所以當那個點度數為0時,必然是最後消失的前驅的v 1,這時的v 1顯然最大。include using namespace std define mod 10000...
hdu 2647 拓撲排序)
思路 就是乙個簡單的拓撲排序,給每個節點標號,不過要注意的是訪問過的節點的id應該取最大才能滿足要求,然後就是要反向建邊 這裡wa了好多次 1 include2 include3 include4 include5 include6 include7 using namespace std 8 de...