博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
29.奖金(拓扑排序)
阅读量:4973 次
发布时间:2019-06-12

本文共 1557 字,大约阅读时间需要 5 分钟。

【问题描述】

  由于无敌的凡凡在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<=1000m<=2000100%的数据满足n<=10000m<=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;

}

转载于:https://www.cnblogs.com/c1299401227/p/5370794.html

你可能感兴趣的文章
VS 2013 配置份openGL环境
查看>>
修改 CKEditor 超链接的默认协议
查看>>
zoj3795 Grouping --- 良好的沟通,寻找最长的公路
查看>>
【SSH2(理论+实践)】--Hibernate步步(一个)
查看>>
深入浅出JMS(一)——JMS简要
查看>>
JDBC连接MySQL数据库及演示样例
查看>>
小波说雨燕 第三季 构建 swift UI 之 UI组件集-视图集(四)Alert View视图 学习笔记...
查看>>
多线程基础(二)pthread的了解
查看>>
百度SDK的使用第一天
查看>>
python学习笔记3:列表、元组和集合
查看>>
数组的初始化
查看>>
bzoj3156 防御准备
查看>>
Git----查看提交日志
查看>>
XE7/X10.2 Datasnap使用 dbExpress 连接MySQL数据库
查看>>
Eclipse修改编码格式
查看>>
生成器和协程 —— 你想知道的都在这里了
查看>>
初级算法-6.两个数组的交集 II
查看>>
欧拉函数 / 蒙哥马利快速幂 / 容斥
查看>>
Makefile
查看>>
软件开发文档以及项目开发流程理解
查看>>