奖金【拓扑排序】【DP】

编程入门 行业动态 更新时间:2024-10-28 17:21:01

奖金【<a href=https://www.elefans.com/category/jswz/34/1759744.html style=拓扑排序】【DP】"/>

奖金【拓扑排序】【DP】

>Description
  由于无敌的凡凡在2005年世界英俊帅气男总决选中胜出,Yali Company总经理Mr.Z心情好,决定给每位员工发奖金。公司决定以每个人本年在公司的贡献为标准来计算他们得到奖金的多少。
  于是Mr.Z下令召开m方会谈。每位参加会谈的代表提出了自己的意见:“我认为员工a的奖金应该比b高!”Mr.Z决定要找出一种奖金方案,满足各位代表的意见,且同时使得总奖金数最少。每位员工奖金最少为100元。


>Input
两个整数n,m,表示员工总数和代表数;
以下m行,每行2个整数a,b,表示某个代表认为第a号员工奖金应该比第b号员工高。

>Output
若无法找到合法方案,则输出“-1”;否则输出一个数表示最少总奖金。


>Sample Input
2 1
1 2

>Sample Output
201


>解题思路
拓扑排序模板(+DP)。


>代码

#include<iostream>
#include<cstdio>
using namespace std;
struct ooo
{int to,next;
}a[200005];
int n,m,head,tail,h[100005],st[100005],tt,aa,bb,c[100005],f[100005],ans;
int main()
{scanf("%d%d",&n,&m);for(int i=1;i<=m;i++){scanf("%d%d",&aa,&bb);a[++tt].to=aa; a[tt].next=h[bb]; h[bb]=tt;c[aa]++;}for(int i=1;i<=n;i++)if(!c[i]) st[++tail]=i,f[i]=100; //每人最少得到100元while(head<tail){head++;for(int i=h[st[head]];i;i=a[i].next){f[a[i].to]=max(f[a[i].to],f[st[head]]+1); //DP:a的奖金比b最少高1元c[a[i].to]--; //入度--if(!c[a[i].to]) st[++tail]=a[i].to;}}if(tail!=n){printf("-1");return 0;}for(int i=1;i<=n;i++)ans+=f[i];printf("%d",ans);return 0;
} 

更多推荐

奖金【拓扑排序】【DP】

本文发布于:2023-07-28 21:47:40,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1327098.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:拓扑   奖金   DP

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!