题目描述
正如其他物种一样,奶牛们也喜欢在排队打饭时与它们的朋友挨在一起。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(