hdu 2647 拓撲排序

2021-07-23 19:44:17 字數 770 閱讀 2018

題意:就是後面的人必須比前面的人領的前多1,每個人至少888,問要總共要多少錢。

思路:裸的的拓撲排序,因為是佇列,層數是一層一層遞進的,所以當那個點度數為0時,必然是最後消失的前驅的v+1,這時的v+1顯然最大。

#include

using

namespace

std;

#define mod 1000000007

#define pi acos(-1.0)

#define inf 0x3f3f3f3f

typedef

long

long ll;

typedef

unsigned

long

long ull;

const

int maxn=10010;

intvector

g[maxn];

int n,m,v[maxn],du[maxn];

int a,b;

ll topsort()

while(!q.empty())}}

if(tot!=n)return -1;

ll ret=888ll*n;

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

ret+=v[i];

return ret;

}int main()

printf("%lld\n",topsort());

}

return

0;}

HDU 2647拓撲排序

還有乙個地方需要注意 判斷輸出 1的情況不能只判斷沒有乙個入度為0的點,因為有可能在中間就出現矛盾了,如 a b c d c 有入度為0的點,但卻要輸出 1 include include include includeusing namespace std define max 10005 int...

hdu 2647 拓撲排序)

思路 就是乙個簡單的拓撲排序,給每個節點標號,不過要注意的是訪問過的節點的id應該取最大才能滿足要求,然後就是要反向建邊 這裡wa了好多次 1 include2 include3 include4 include5 include6 include7 using namespace std 8 de...

HDU 2647(拓撲排序)

hdu 2647 題意 輸入n行資料a,b 表示a的錢數大於b的錢數,最低的人分的的錢數為888,問最少需要多少錢可以分給員工 思路 標準的拓撲排序,不過這題需要逆向拓撲 注意點 1 如何判斷途中有換,或者說有的點沒有選擇到,用個int整型cnt,利用拓撲排序的特點,每個點只查詢一次,所以當cnt ...