【题目描述】
由于无敌的凡凡在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
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<string>
#include<cstdlib>
#include<queue>
#include<vector>
#include<set>
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
#define N 100001
#define MOD 123
#define E 1e-6
using namespace std;
int n,m;
int head[N],side[N];
int f[N],q[N];
int vis[N];
int cnt;
struct node{
int pre;
int next;
}a[N];
void add_edge(int x,int y)
{
cnt++;
a[cnt].pre=y;
a[cnt].next=head[x];
head[x]=cnt;
}
void topsort(int x)
{
int headd=1,tail=1;
vis[x]=1;
q[tail]=x;
tail++;
while(headd<tail)
{
int u=q[headd];
for(int b=head[u];b;b=a[b].next)
{
int v=a[b].pre;
side[v]--;
f[v]=max(f[v],f[u]+1);
if(side[v]==0)
{
q[tail]=v;
tail++;
vis[v]=1;
}
}
headd++;
}
}
int main()
{
int sum=0;
cin>>n>>m;
for(int i=1;i<=n;i++)
f[i]=100;
for(int i=1;i<=m;i++)
{
int x,y;
cin>>y>>x;
add_edge(x,y);
side[y]++;
}
for(int i=1;i<=n;i++)
if(!vis[i]&&!side[i])
topsort(i);
for(int i=1;i<=n;i++)
if(!vis[i])
{
cout<<"Poor Xed"<<endl;
return 0;
}
for(int i=1;i<=n;i++)
sum+=f[i];
cout<<sum<<endl;
return 0;
}
信息学奥赛一本通T1352:拓扑排序与关键路径 奖金 归属于 拓扑排序与关键路径,更多同类题解源程序见:拓扑排序与关键路径 和 奖金
0 篇文章
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!