Reward HDU 2647(拓撲排序)

2021-09-11 03:10:22 字數 1263 閱讀 6492

傳送門:qaq

題意:給你n個人,m個關係,關係是指乙個人的獎勵比乙個人高,然後讓你求最少的獎勵金額。

思路:如果存在環的話,就不可能,所以就是簡單的乙個拓撲排序。

**:

#include#include#include#include#include#include#include#includeusing namespace std;

const int inf = 0x3f3f3f3f;

#define ll long long int

vectorgx[11000];

int ax[11000];

int vis[11000];

int vis2[11000];

int ggg[11000];

map, int>mp;

vectorhu;

int flag = 0;

int sum;

int tot = 0;

struct inst

inst(int x, int num) :x(x), num(num) {}

};int dfs(int x)

int ans = 0;

for (int i = 0; i < gx[x].size(); i++)

if (vis[gx[x][i]] == 1)

ans = max(ans, dfs(gx[x][i]));

vis2[x] = 0;

if (flag)

return 0;

} sum += ans;

ggg[x] = max(ggg[x], ans);

return ans + 1;

}int main(void)

memset(ax, 0, sizeof(ax));

memset(vis, 0, sizeof(vis));

memset(ggg, 0, sizeof(ggg));

hu.clear();

for (int i = 0; i < m; i++)

gx[a].push_back(b);

mp[make_pair(a, b)] = 1;

ax[b]++;

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

} for (int i = 0; i } if (flag == 1 || tot != n)

else

} return 0;

}

Reward hdu2647逆拓撲排序

題意 工人發工資,每個個人都有要求,比某人多,問滿足搜有人要求的最小總工資數。思路 逆拓撲排序 之前都是誰大誰是頭節點,但是這題如果誰大誰為頭的話,那麼頭結點的工資將不停的改變,有點麻煩,但是根節點工資永遠不會變,所以可以反過來,誰小誰當根節點,也就是出度變入度,入度變出度,剩下和拓撲一樣,只不過在...

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