Description–
给每位员工发奖金。
参加会谈的m位代表提出了自己的意见:“我认为员工a的奖金应该比b高!”
请找出一种奖金方案,满足各位代表的意见,且同时使得总奖金数最少。
每位员工奖金最少为100元。
Input–
第一行两个整数n,m,表示员工总数和代表数;
以下m行,每行2个整数a,b,表示某个代表认为第a号员工奖金应该比第b号员工高。
Output–
输出一个数,表示最少总奖金。
若无法找到合法方案,则输出“-1”。
Sample Input–
2 1
1 2
Sample Output–
201
说明–
80%的数据满足n<=1000,m<=2000;
100%的数据满足n<=10000,m<=20000。
代码–
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
vector<int> f[10005];
queue<int> q;
int n, m, a, b, k, o, ans;
int l[10005], s[10005];
int main()
{
freopen("reward.in", "r", stdin);
freopen("reward.out", "w", stdout);
scanf("%d%d", &n, &m);
for (int i = 1; i <= m; ++i)
{
scanf("%d%d", &a, &b);
f[b].push_back(a); //注意要反着存
l[a]++;
}
for (int i = 1; i <= n; ++i)
if (!l[i]) q.push(i);
while (!q.empty())
{
k++, o = q.front();
ans += s[o];
for (int i = 0; i < f[o].size(); ++i)
{
s[f[o][i]] = max(s[f[o][i]], s[o] + 1);
l[f[o][i]]--;
if (!l[f[o][i]]) q.push(f[o][i]);
}
q.pop();
}
if (k == n) //有方案
printf("%d", n * 100 + ans);
else
printf("-1");
return 0;
}