設計 SPFA 差分約束

2021-08-21 10:44:43 字數 1510 閱讀 2594

有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...