題意:就是後面的人必須比前面的人領的前多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 ...