(历史第一篇)
题目描述
由于可爱的的ZZ学长在2097年世界女装少年总决选中胜出,FZOI Company总经理Mr.Sun心情好,决定给每位员工发奖金。公司决定以每个人本年在公司的贡献为标准来计算他们得到奖金的多少。 于是Mr.Sun下令召开m方会谈。每位参加会谈的代表提出了自己的意见:“我认为员工a的奖金应该比b高!”Mr.Sun决定要找出一种奖金方案,满足各位代表的意见,且同时使得总奖金数最少。每位员工奖金最少为100元。
输入格式
第一行两个整数n,m,表示员工总数和代表数;
以下m行,每行2个整数a,b,表示某个代表认为第a号员工奖金应该比第b号员工高。
输出格式
若无法找到合理方案,则输出“Poor Xed”;否则输出一个数表示最少总奖金。
输入输出样例
输入 #1
2 1 1 2
输出 #1
201
AC代码
#include<bits/stdc++.h>
using namespace std;
const int N = 20010;
int head[N], ver[N], nxt[N], tot;
int n, m;
int deg[N], a[N], cnt;
int salary[N];
void add(int x, int y) {
ver[++tot] = y, nxt[tot] = head[x], head[x] = tot;
deg[y]++;
}
void topsort() {
queue<int> q;
for (int i = 1; i <= n; i++)
if (!deg[i]) {
q.push(i);
salary[i] = 100;
}
while (q.size()) {
int x = q.front(); q.pop();
a[++cnt] = x;
for (int i = head[x]; i; i = nxt[i]) {
int y = ver[i];
if (--deg[y] == 0) {
salary[y] = salary[x] + 1;
q.push(y);
}
}
}
}
int main() {
cin >> n >> m;
for (int i = 0; i < m; i++) {
int x, y; cin >> x >> y;
add(y, x);
}
topsort();
if (cnt < n) puts("Poor Xed");
else {
int res = 0;
for (int i = 1; i <= cnt; i++)
res += salary[i];
cout << res << endl;
}
return 0;
}