AcWing 1192. 奖金
. 奖金
一、题目描述
由于无敌的凡凡在年世界英俊帅气男总决选中胜出, 总经理心情好,决定给每位员工发奖金。
公司决定以每个人本年在公司的贡献为标准来计算他们得到奖金的多少。
于是下令召开 方会谈。
每位参加会谈的代表提出了自己的意见:“我认为员工 的奖金应该比 高!”
决定要找出一种奖金方案,满足各位代表的意见,且同时 使得总奖金数最少。
每位员工奖金最少为元,且必须是整数。
输入格式
第一行包含整数 ,分别表示公司内员工数以及参会代表数。
接下来 行,每行 个整数 ,表示某个代表认为第 号员工奖金应该比第 号员工高。
输出格式
若无法找到合理方案,则输出“ ”;
否则输出一个数表示 最少总奖金。
数据范围
输入样例:
2 1
1 2
输出样例:
201
二、问题与解答
:本题与拓扑序有什么关系?
如果,那么这个图是有向无环图 存在拓扑序
如果,那么这个图是有向有环图 不存在拓扑序
所以,可以利用+维护入度的办法,检查此图,是否能够构成,是则求路径,不是表示有环,在本题中就是存在逻辑上的冲突,无解。
:如何求路径+每个点的最小值?
- 在用+维护入度方法检查图时,就可以一同维护一下点的顺序,也就是路径。
- 每个点的最小值,其实是受所有来源点的要求决定,比如要求是,要求是,那么只能是,此时,看似取的是多个来源的最大值,其实这才是此点的最小值。
三、拓扑排序+最长路
思路:利用拓扑序判环,利用拓扑序找出的点进行三角不等式计算,找出最大值,累加最大值。
注意:添加超级源点是一个经典办法。
#include <bits/stdc++.h>
using namespace std;
const int N = 10010, M = 30010;
int din[N]; // 记录每个节点入度
int dist[N]; // 记录每个节点距离起点的最小值
int n, m;
// 链式前向星
int e[M], h[N], idx, w[M], ne[M];
void add(int a, int b, int c = 0) {
e[idx] = b, ne[idx] = h[a], w[idx] = c, h[a] = idx++;
}
vector<int> path;
bool topsort() {
queue<int> q;
for (int i = 1; i <= n; i++)
if (!din[i]) q.push(i);
while (q.size()) {
int u = q.front();
q.pop();
path.push_back(u); // 记录拓扑序路径
for (int i = h[u]; ~i; i = ne[i]) {
int v = e[i];
din[v]--;
if (din[v] == 0) q.push(v);
}
}
return path.size() == n;
}
int main() {
memset(h, -1, sizeof h);
scanf("%d %d", &n, &m);
while (m--) {
int a, b;
scanf("%d %d", &a, &b);
add(b, a, 1); // a比b高,意味着 b->边权为1的边->a
din[a]++;
}
if (!topsort()) {
puts("Poor Xed");
return 0;
}
// 每个员工奖金最少是100元
for (int i = 1; i <= n; i++) dist[i] = 100;
// 根据拓扑序求最长路
for (auto u : path) { // 枚举拓扑序路径
// 枚举节点u所有邻接的节点,找出最大的转移,可以看一下题解中的图,就明白了
for (int i = h[u]; ~i; i = ne[i]) {
int v = e[i];
dist[v] = max(dist[v], dist[u] + w[i]);
}
}
int res = 0;
for (int i = 1; i <= n; i++) res += dist[i]; // 每个点的累加和,就是总的,最小的, 奖金数
printf("%d\n", res);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
2019-04-08 连接慢的主要原因是DNS解析导致