有n
nn頭牛,現在要設計乙個順序讓他們站成一排給他們餵食。奶牛們按照編號順序依次站立,允許有多隻牛站在同一位置。有一些牛希望之間的距離在某個範圍內,也有一些牛希望兩之間的距離大於等於某個距離。如果存在某種方案滿足上述要求,請你輸出1
11號牛和n
nn號牛之間最大距離。
i np
ut
input
inpu
t
4 2 1
1 3 10
2 4 20
2 3 3
out
pu
toutput
output
27
考場上就想到是最短路,但是沒能打出來。
我們可以把每頭牛看成乙個點,如果兩頭牛希望之間的距離小於某個範圍,就在這兩頭牛之間連一條長度為範圍的單向邊(小號牛連向大號牛),如果兩頭牛希望之間的距離大於某個範圍,就在這兩頭牛之間連一條長度為負範圍的單向邊(大號牛連向小號牛),建完圖之後,跑一邊spfa,如果有答案,輸出答案,如果沒能到達點n
nn,那麼輸出−2-2
−2(距離可以無限),如果迴圈打到了一定次數(我設的是n×3
n\times3
n×3),那麼說明出現了環,就不存在這樣的方案。
#include
#include
#include
using
namespace std;
const
int inf=
99999999
;int n,m1,m2,dep,x,y,z,head[
200001
],vis[
200001
],dis[
200001
],t;
bool ok;
struct edge
e[200001];
void
add(
int from,
int to,
int d)
void
spfa()
q.push(1
);vis[1]
=1; dis[1]
=0;while
(q.size()
)for
(int i=head[u]
;i;i=e[i]
.next)}}
}}intmain()
for(
int i=
1;i<=m2;i++
)spfa()
;if(!ok)
return0;
if(dis[n]
==inf)
return
printf
("-2\n")&
0;else
return
printf
("%d\n"
,dis[n])&
0;}
spfa 差分約束模板
cf1131d 給出乙個n m關係表,有 三種關係,要求為這n m個物件分配乙個值,使得滿足約束關係且最大值最小。用差分約束,轉化為 x 1。轉化為 且 如果y要比x至少大1,就建立邊x指向y。對於這樣一張圖,滿足所有要求其實就意味著能走的邊都走 滿足關係 不能滿足的點就鬆弛 變大 類似求最長路。b...
POJ3169差分約束 SPFA 差分約束
思路 假設i j 兩隻奶牛可以站在同乙個位置,但是必須公升序排列,所以有差分約束方程d i d i 1 0 對於兩隻有好感的奶牛有差分約束方程d j d i k 對於兩隻反感的奶牛有差分約束方程d i d j k 有了約束方程就可以spfa include include include inclu...
SCOI 糖果 差分約束 SPFA
scoi 糖果 題目描述 幼兒園裡有n個小朋友,lxhgww老師現在想要給這些小朋友們分配糖果,要求每個小朋友都要分到糖果。但是小朋友們也有嫉妒心,總是會提出一些要求,比如小明不希望小紅分到的糖果比他的多,於是在分配糖果的時候,lxhgww需要滿足小朋友們的k個要求。幼兒園的糖果總是有限的,lxhg...