【USACO05DEC】【FZOJ-2919】排队 布局

该博客介绍了一道关于奶牛排队的USACO题目,奶牛们希望与朋友保持特定距离,要求满足所有友谊和敌对关系的距离限制。通过输入和输出的描述,解析了如何解决这个差分约束问题,利用SPFA算法判断负权环并确定1号和N号奶牛的最大距离。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

正如其他物种一样,奶牛们也喜欢在排队打饭时与它们的朋友挨在一起。FJ 有编号为 1…N的N 头奶牛 (2≤N≤1000)。开始时,奶牛们按照编号顺序来排队。奶牛们很笨拙,因此可能有多头奶牛在同一位置上。

有些奶牛是好基友,它们希望彼此之间的距离小于等于某个数。有些奶牛是情敌,它们希望彼此之间的距离大于等于某个数。

给出 ML 对好基友的编号,以及它们希望彼此之间的距离小于等于多少;又给出 MD 对情敌的编号,以及它们希望彼此之间的距离大于等于多少 (1≤ML, MD≤10^4)。

请计算:如果满足上述所有条件,1号奶牛和 N 号奶牛之间的距离最大为多少。

输入

第一行:三个整数 N,ML,MD,用空格分隔。

第 2…ML+1 行:每行三个整数 A,B,D,用空格分隔,表示 A 号奶牛与 B 号奶牛之间的距离须 ≤D。保证 1≤A<B≤N, 1≤D≤10^6.

第 ML+2…ML+MD+1 行:每行三个整数 A,B,D,用空格分隔,表示 A 号奶牛与 B 号奶牛之间的距离须 ≥D。保证 ,1≤A<B≤N, 1≤D≤10^6

输出

一行,一个整数。如果没有合法方案,输出 -1. 如果有合法方案,但 1 号奶牛可以与 N 号奶牛相距无穷远,输出 -2. 否则,输出 1 号奶牛与 N 号奶牛间的最大距离。

样例输入

4 2 1
1 3 10
2 4 20
2 3 3

样例输出

27

算是差分约束的裸题吧。
不妨设i>j,对亲近的牛,则Di-Dj<=v。对情敌,Di-Dj>=v,同时乘以-1就得到Dj-Di<=-v。
只不过,这道题要先判断负权环,再判断1和n是否联通。所以跑两遍spfa
判断负权环时才可以加入超级原点,不然求出的dis[n]会为0。

代码

#include<bits/stdc++.h>
using namespace std;
const int mac=2050000;
const int microsoft=2200;
int first[mac],nex[mac],to[mac],data[mac],cnt,Gay,enemy,n;
int vis[microsoft],dis[microsoft],Time[microsoft];
int inf,flag=0;
void edge(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值