HDU 2647(拓撲排序)

2022-05-22 18:27:11 字數 1081 閱讀 7442

hdu 2647

題意:輸入n行資料a,b  ,表示a的錢數大於b的錢數,最低的人分的的錢數為888,問最少需要多少錢可以分給員工

思路:標準的拓撲排序,不過這題需要逆向拓撲

注意點:1、如何判斷途中有換,或者說有的點沒有選擇到,用個int整型cnt,利用拓撲排序的特點,每個點只查詢一次,所以當cnt==n的時候,輸出sum。

2、多組輸入不要忘了初始化陣列之類的

1 #include 2 #include 3 #include 4 #include 5 #include 

6 #include 7 #include 8 #include 9 #include 10 #include 11 #include

12 #include 13

//const int maxn = 1e5+5;

14#define ll long long

15#define max int_max

16#define for(i,a,b) for( ll i = a;i <= b;++i)

17using

namespace

std;

18int

n,m,sum,head,headmoney,a,b,cnt;

19int degree[11000

];      //度,我就不多說了

20 vectorvec[11000

];    //存此節點下的子節點

21 queueque;          //存接下來思考的節點

22int

main()

234344}

4546

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

4755}56

while(!que.empty())

5772}73

}74if(cnt==n)

7578

else cout<<"-1"

<7980

8182}83

84 }

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