惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Project Zero
Project Zero
月光博客
月光博客
Y
Y Combinator Blog
T
The Blog of Author Tim Ferriss
O
OpenAI News
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Know Your Adversary
Know Your Adversary
Last Week in AI
Last Week in AI
S
Securelist
Engineering at Meta
Engineering at Meta
博客园 - 司徒正美
P
Privacy & Cybersecurity Law Blog
T
Tailwind CSS Blog
F
Fortinet All Blogs
博客园 - 三生石上(FineUI控件)
Scott Helme
Scott Helme
MyScale Blog
MyScale Blog
P
Proofpoint News Feed
云风的 BLOG
云风的 BLOG
C
Cisco Blogs
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
小众软件
小众软件
U
Unit 42
Microsoft Azure Blog
Microsoft Azure Blog
Hacker News: Ask HN
Hacker News: Ask HN
Hugging Face - Blog
Hugging Face - Blog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
SecWiki News
SecWiki News
宝玉的分享
宝玉的分享
P
Proofpoint News Feed
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
H
Hackread – Cybersecurity News, Data Breaches, AI and More
L
Lohrmann on Cybersecurity
IT之家
IT之家
Security Archives - TechRepublic
Security Archives - TechRepublic
I
InfoQ
S
Security @ Cisco Blogs
Webroot Blog
Webroot Blog
Hacker News - Newest:
Hacker News - Newest: "LLM"
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
F
Full Disclosure
D
Darknet – Hacking Tools, Hacker News & Cyber Security
The GitHub Blog
The GitHub Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
Jina AI
Jina AI
Cyberwarzone
Cyberwarzone
人人都是产品经理
人人都是产品经理
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
B
Blog RSS Feed
Apple Machine Learning Research
Apple Machine Learning Research

PYM博客

Python 部署 Lexfence:基于 AI 大模型的内容审核系统 Docker 部署 Lexfence:一款开源易用的AI审核服务 2026年了,电脑病毒真是防不胜防,3个好用的杀毒软件推荐(亲身经历) 本站已更换 Cloudflare 至 EdgeOne Claude Opus 4.8来了!不再是比聪明,而是更能干活,敢于认错,变得诚实了! Note.ms在线简洁匿名记事本,如何修改/0页面 解禁了?RTX 5090 PRO6000上架京东自营店 用工具轻松的给Frpc配置SSL证书,穿透Http与Https流量,开启强制Https跳转 「POJ1740」A New Stone Game SG函数与博弈论题解 Deepseek V4发布了!综合能力比肩顶级闭源模型! 国内就可以使用的免费SuperGrok,无需登录无需排队,完全公益免费! 保姆级干货:在AI时代薅羊毛,如何获得大量免费的AI API?学完这个你的小龙虾就不缺粮食了! Deepseek-V4要来了的预兆?Deepseek专家模式低调上新!Deepseek首次引入模式分层! 游玩本站必读公告 Claude Code源代码惨遭泄露,几句话告诉你泄露的原因,附下载链接 Docker快速部署Astrbot,开源的一站式 Agentic 个人和群聊助手 今天是愚人节,请将这篇文章转发给你的亲朋好友 P4171 [JSOI2010] 满汉全席 2-SAT详细题解 P1993 小 K 的农场 差分约束SPFA判断负环 详细题解 Luogu P2850 [USACO06DEC] Wormholes G SPFA算法思路与C++代码详解 Luogu P2136 拉近距离 SPFA判断负环题解 与 思路 开源 UI 元素社区库,让你的网站更加美观! 免费的AI和付费的API区别到底在哪里?付费的AI真的更聪明吗?
P6145 [USACO20FEB] Timeline G SPFA差分约束最长路题解
PYM · 2026-03-25 · via PYM博客

题目传送门

题意简述

N 次挤奶,在 M 天 内完成,需要求出每次挤奶的最早可行日期,同时满足两个硬性约束:

  1. 基础约束:第 i 次挤奶的日期 不能早于第 Sᵢ 天

  2. 时序约束:给定 C 条规则 (a, b, x),要求第 b 次挤奶的日期 ≥ 第 a 次挤奶的日期 + x(b 比 a 至少晚 x 天);

  3. 题目保证所有约束无矛盾,一定存在合法方案。

题目思路

步骤 1:建图

我们引入超级源点 0,这样可以让 SPFA 能一次性处理所有规则,不用额外写代码特殊处理。

值得注意的是,超级源点 0 到其他点的单向边代价应该是 这个点不早于第 Sᵢ 天挤奶的时间,也就是 Sᵢ ,不然的话SPFA不会按照限定的时间,可能会提前。


  1. 距离数组 dis[]全部初始化为负无穷(因为我们要求的是最长路)

  2. 超级源点 dis[0] = 0

  3. 用队列存储待松弛的节点,初始把节点 0 入队

  4. 标记数组 vis[]:标记节点是否在队列中,避免重复入队


步骤 3:SPFA 最长路松弛

标准 SPFA 流程,但是判断 dis[v] > dis[u] + w 改成 dis[v] < dis[u] + w


步骤 4:得到答案

队列空时,dis[i] 就是第 i 个变量的最小合法值(满足所有约束)。

然后直接输出就可以了,恭喜你做完了这道题!

AC代码

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e5 + 5, INF = 1e9 + 7;
int n, m, kk;        // n:挤奶次数 m:总天数 kk:约束条数
int lim[N];          // 存储每次挤奶的最早天数下限
vector<vector<pair<int, int>>> e(N); // 邻接表存图
bool vis[N];         // SPFA标记数组
ll dis[N];           // 存储答案(最长路结果)

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);
	cin >> n >> m >> kk;
	for (int i = 1; i <= n; ++i) cin >> lim[i]; // 读取下限约束
	for (int i = 1; i <= kk; ++i) {
		int u, v, w;
		cin >> u >> v >> w;
		e[u].emplace_back(v, w); // 建约束边:v >= u + w
	}
	for (int i = 1; i <= n; ++i) {
		e[0].emplace_back(i, lim[i]); // 超级源点:满足i >= lim[i]
	}
	fill(dis + 1, dis + n + 1, -INF); // 最长路初始化:负无穷
	vis[0] = true;
	dis[0] = 0;
	queue<int> q;
	q.emplace(0);
	while (!q.empty()) {
		int u = q.front();
		q.pop();
		vis[u] = false;
		for (auto tmp : e[u]) {
			int v, w;
			tie(v, w) = tmp;
			if (dis[v] < dis[u] + w) { // 最长路松弛操作
				dis[v] = dis[u] + w;
				if (!vis[v]) {
					vis[v] = true;
					q.emplace(v);
				}
			}
		}
	}
	for (int i = 1; i <= n; ++i) {
		cout << dis[i] << "\n"; // 输出每次挤奶的最早日期
	}
	return 0;
}