傳送門: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...