hdu2647解題報告

2021-06-18 07:19:57 字數 834 閱讀 9438

題意:有個工廠的老闆給工人發獎金,每人基礎都是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...