【题目描述】
由于无敌的凡凡在2005年世界英俊帅气男总决选中胜出,Yali Company总经理Mr.Z心情好,决定给每位员工发奖金。公司决定以每个人本年在公司的贡献为标准来计算他们得到奖金的多少。
于是Mr.Z下令召开m方会谈。每位参加会谈的代表提出了自己的意见:“我认为员工a的奖金应该比b高!”Mr.Z决定要找出一种奖金方案,满足各位代表的意见,且同时使得总奖金数最少。每位员工奖金最少为100元。
【输入】
第一行两个整数n,m,表示员工总数和代表数;
以下m行,每行2个整数a,b,表示某个代表认为第a号员工奖金应该比第b号员工高。
【输出】
若无法找到合理方案,则输出“Poor Xed
”;否则输出一个数表示最少总奖金。
【输入样例】
2 1
1 2
【输出样例】
201
【提示】
【数据规模】
80%的数据满足:n≤1000,m≤2000;
100%的数据满足:n≤10000,m≤20000。
#include<bits/stdc++.h>
using namespace std;
const int N=10005;
const int M=20005; //定义两个定量N和M,分别为10005和20005
struct node{
int v,nxt;
};
node e[M];
int n,m,cnt=0,h[N],ru[N];
bool flag=1;
long long a[N];
void add(int ui,int vi){ //存放ui指向vi的边
++cnt; //边的数目下标
e[cnt].v=vi; //存放边的终点
e[cnt].nxt=h[ui]; //将ui的上一个儿子的位置号存放到当前边的nxt
h[ui]=cnt; //将当前边作为ui的第一个儿子,存放其位置号
}
void tuopu(){
for(int i=1;i<=n;++i){ //最多n轮
int u;
for(u=1;u<=n;++u) //寻找入度为0的点
if(ru[u]==0) break;
if(u>n){
flag=0; break;
}
ru[u]=-1;
for(int j=h[u];j!=0;j=e[j].nxt){
int vi=e[j].v;
ru[vi]--;
a[vi]=max(a[vi],a[u]+1);
}
}
}
int main(){
cin>>n>>m;
memset(h,0,sizeof(h));
memset(ru,0,sizeof(ru)); //入度初始化为0
for(int i=1;i<=m;++i){
int u,v;
scanf("%d%d",&u,&v);
add(v,u);
ru[u]++;
}
memset(a,0,sizeof(a));
for(int i=1;i<=n;++i)
if(ru[i]==0) a[i]=100;
tuopu();
if(flag==0){
cout<<"Poor Xed"; return 0;
}
long long ans=0;
for(int i=1;i<=n;++i)
ans+=a[i];
cout<<ans;
return 0;
}