23.奖金(拓扑排序)

奖金(拓扑排序)

【问题描述】

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

【算法分析】

  首先构图,若存在条件“a的钱比b多”则从b引一条有向指向a;然后拓扑排序,若无法完成排序则表示问题无解(存在圈);若可以得到完整的拓扑序列,则按序列顺序进行递推:

设f[i]表示第i个人能拿的最少奖金数;

首先所有f[i]=100(题目中给定的最小值);

   然后按照拓扑顺序考察每个点i,若存在有向边(j,i),则表示f[i]必须比f[j]大,因此我们令f[i] = Max { f[i] , f[j]+1 }即可;

递推完成之后所有f[i]的值也就确定了,而答案就等于f[1]+…+f[n]。

代码:

#include

using namespace std;

#include

#define maxn 10001

int p[maxn][301],n,m,a,b,ans[maxn],rudu[maxn];

long long money=0;

void input();

int topsort();

int main()

{

input();

if(topsort()) printf("%I64d",money);

else printf("Poor Xed");

return 0;

}

void input()

{

scanf("%d%d",&n,&m);

for(int i=1;i<=m;++i)

{

scanf("%d%d",&a,&b);

p[b][0]++;//储存从b出发的边有几条

p[b][p[b][0]]=a;//储存从b出发的第n条边的终点编号

rudu[a]++;

}

}

int topsort()

{

int tot=0,k=0,t;

while(tot

{

t=0;

for(int i=1;i<=n;++i)//一次性把这次入栈的全部处理,因为一起入栈的他们的奖金一定一样多,因为入度相同

if(!rudu[i])//每次都重新建栈

{

rudu[i]=99999;//防止再次入栈

tot++;t++;

ans[t]=i;//在栈中记录点的编号

money+=100;

}

money+=k*t;//每次都把入度+1的点奖金+1

k++;//只算总数就行了

if(t==0) return 0;//如果栈为空,但是n个点没有全部入栈,则说明再也没有入度是0的点了,就说明有环

for(int i=1;i<=t;++i)

for(int j=1;j<=p[ans[i]][0];++j)//把入栈的点的终点的入度自减1

{

rudu[p[ans[i]][j]]--;

}

}

return 1;

}

时间: 2024-10-05 15:20:26

23.奖金(拓扑排序)的相关文章

拓扑排序1.奖金

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

【日常学习】【拓扑排序】家谱树&amp;FZU1483 Sicily1424 奖金 题解

拓扑排序的定义 简单来说就是给你一个图写出一个序列 图中如果a通向b 那么序列中A必须排在B前面 拓扑排序可能有很多结果 必须是有向无环图 可以利用拓扑排序来判定环的存在 当然也可以用神奇的SPFA 但是拓扑排序时间复杂度很低 只有O(V+E) 基本实现思路是 每次取出入度为0的点 然后删除与它相连的边 直到没有边  如果还有边但是找不到入度为0的点 说明有环 学习这个算法联系了两道题目 很经典很单纯 但是一般没有OJ有评测 奖金这道题目在福州大学OJ和中山大学萌萌哒Sicily上找到了评测(为

hdu 2647 (拓扑排序 邻接表建图的模板) Reward

题目链接http://acm.hdu.edu.cn/showproblem.php?pid=2647 老板给员工发工资,每个人的基本工资都是888,然后还有奖金,然后员工之间有矛盾,有的员工希望比某员工的奖金多,老板满足了所以员工的这种心思,而且老板下午发的总工资最少,问最少是多少?比如 a b 表示a的工资比b要高(高一块钱),当出现a b   b c   c a这种环的时候输出-1 拓扑排序http://www.cnblogs.com/tonghao/p/4721072.html 小指向大

拓扑排序 codevs 4040 cojs 438

codevs 4040 EZ系列之奖金 时间限制: 1 s 空间限制: 64000 KB 题目等级 : 钻石 Diamond 题目描述 Description 由于无敌的WRN在2015年世界英俊帅气男总决选中胜出,EZ总经理Mr.Lin心情好,决定给每位员工发奖金.EZ决定以每个人本年在EZ的贡献为标准来计算他们得到奖金的多少. 于是Mr.Lin下令召开m方会谈.每位参加会谈的代表提出了自己的意见:“我认为学生a的奖金应该比b高!”Mr.Lin决定要找出一种奖金方案,满足各位代表的意见,且同时

CSU 1804: 有向无环图(拓扑排序)

http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1804 题意:…… 思路:对于某条路径,在遍历到某个点的时候,之前遍历过的点都可以到达它,因此在这个时候对答案的贡献就是∑(a1 + a2 + a3 + ... + ai) * bv,其中a是之前遍历到的点,v是当前遍历的点. 这样想之后就很简单了.类似于前缀和,每次遍历到一个v点,就把a[u]加给a[v],然后像平时的拓扑排序做就行了. 1 #include <bits/stdc++.h>

UVALive 6467 Strahler Order 拓扑排序

这题是今天下午BNU SUMMER TRAINING的C题 是队友给的解题思路,用拓扑排序然后就可以了 最后是3A 其中两次RE竟然是因为: scanf("%d",mm); ORZ 以后能用CIN还是CIN吧 QAQ 贴代码了: 1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 #include <math.h> 5 #include <iostre

寒假集训日志(二)——最小生成树,拓扑排序,欧拉回路,连通路

今天学的内容挺多的. (一)首先说最小生成树,两种算法: 1.Kruskal算法( 将边排序,然后再选,关键在于检查是否连通,使用并查集) 2.Prim算法(使用点集,有点类似与最短路的算法) 第一题是并查集算法的使用: A - The Suspects Time Limit:1000MS     Memory Limit:20000KB     64bit IO Format:%I64d & %I64u Submit Status Description 严重急性呼吸系统综合症( SARS),

Sorting It All Out 拓扑排序+确定点

这一道题的话  数据有一点问题    ........     例如 不过 还是   能理解一下  试试吧  ......... 3 5 A<B B<C C<A A<C B<A 这几组数据 明显反映出来 这是成环的 , 然后 按照 输入输出案例来说 这个是 有序的 ABC 题目要求     在每组数据的   第一行  给你需要排序 的 字母数    和  他们之间的关系数量      然后  输入每组数据    你首先许亚萍判断在输入  第几组 数据的时候 出现了 环    

20151230训练题解(最短路+拓扑排序)

http://acm.hust.edu.cn/vjudge/contest/view.action?cid=103223#problem/B 这道题用经典的dijsktra算法,大概思路就是用dist[x]存储x到已经确定集合的最短路,n次循环到这个这个最小值,然后更新其他点到新集合的最短路即对应的dist[] 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <al