1352:【例4-13】奖金

【题目描述】

由于无敌的凡凡在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;
} 

  • 11
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值