1192 奖金
由于无敌的凡凡在2005年世界英俊帅气男总决选中胜出,Yali Company总经理Mr.Z心情好,决定给每位员工发奖金。
公司决定以每个人本年在公司的贡献为标准来计算他们得到奖金的多少。
于是Mr.Z下令召开 m 方会谈。
每位参加会谈的代表提出了自己的意见:“我认为员工 a 的奖金应该比 b 高!”
Mr.Z决定要找出一种奖金方案,满足各位代表的意见,且同时使得总奖金数最少。
每位员工奖金最少为100元,且必须是整数。
输入格式
第一行包含整数 n,m,分别表示公司内员工数以及参会代表数。
接下来 m 行,每行 22 个整数 a,b,表示某个代表认为第 a 号员工奖金应该比第 b 号员工高。
输出格式
若无法找到合理方案,则输出“Poor Xed”;
否则输出一个数表示最少总奖金。
数据范围
1≤n≤10000,
1≤m≤20000,
1≤a,b≤n
输入样例:
2 1
1 2
输出样例:
201
#include <bits/stdc++.h>
using namespace std;
#define x first
#define y second
#define endl '\n'
typedef long long LL;
typedef pair<int, int> PII;
const int N = 400010, mod = 1000000007;
int e[N], ne[N], idx, h[N];
int d[N];
queue<int> q;
int dist[N];
int cnt, n, m;
vector<int> a;
void add(int a, int b)
{
e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}
bool topsort()
{
for (int i = 1; i <= n; i++)
{
if (!d[i])
{
q.push(i);
a.push_back(i);
}
}
while (q.size())
{
auto t = q.front();
q.pop();
for (int i = h[t]; i != -1; i = ne[i])
{
int j = e[i];
d[j]--;
if (!d[j])
{
a.push_back(j);
q.push(j);
}
}
}
if (a.size() != n)
return false;
return true;
}
void solve()
{
cin >> n >> m;
memset(h, -1, sizeof h);
while (m--)
{
int a, b;
cin >> a >> b;
add(b, a);
d[a]++;
}
if (!topsort())
puts("Poor Xed");
else
{
for (int i = 1; i <= n; i++)
{
dist[i] = 100;
}
int ans = 0;
for (auto x : a)
{
for (int i = h[x]; i != -1; i = ne[i])
{
int j = e[i];
dist[j] = max(dist[j], dist[x] + 1);
}
}
for (int i = 1; i <= n; i++)
ans += dist[i];
cout << ans << endl;
}
}
int main()
{
int t = 1;
// scanf("%d", &t);
while (t--)
{
solve();
}
return 0;
}
/*
*/