洛谷1993 小K的農場(差分約束系統模板題)

2021-08-26 02:13:45 字數 1992 閱讀 2111

點此看題面

大致題意:給你若干組不等式,請你判斷它們是否有解。

差分約束系統

看到若干組不等式,應該很容易想到差分約束系統吧。

l in

klink

link

差分約束系統詳見部落格**差分約束系統

a−b

≥c

a-b≥c

a−b≥

c:轉換可得a−b

≥c

a-b≥c

a−b≥ca−b

≤c

a-b≤c

a−b≤

c:轉換可得b−a

≥−

cb-a≥-c

b−a≥−c

a =b

a=ba=

b:可拆得a−b

≥0

a-b≥0

a−b≥0和b−a

≥0

b-a≥0

b−a≥

0題意轉化

現在我們要考慮,在什麼樣的情況下,差分約束系統會無解

很簡單,如果我們從跑最長路的角度出發,只要出現了正環,就說明無解。

這樣一來,原題就變成了一道判正環的題目。

s pf

aspfa

spfa

判正環應該都會的吧…

**

#include

#define max(x,y) ((x)>(y)?(x):(y))

#define min(x,y) ((x)<(y)?(x):(y))

#define abs(x) ((x)<0?-(x):(x))

#define ll long long

#define ull unsigned long long

#define swap(x,y) (x^=y,y^=x,x^=y)

#define tc() (a==b&&(b=(a=ff)+fread(ff,1,100000,stdin),a==b)?eof:*a++)

#define n 100000

#define m 100000

#define add(x,y,z) (e[++ee].to=y,e[ee].nxt=lnk[x],e[lnk[x]=ee].val=z)

char ff[

100000],

*a=ff,

*b=ff;

using

namespace std;

int n,m,limit,ee=

0,lnk[n+5]

,inqueue[n+5]

,vis[n+5]

;ll dis[n+5]

;struct edgee[2

*m+5];

deque<

int> q;

inline

void

read

(int

&x)inline

void

write

(ll x)

inline

bool

spfa

(int x)

//spfa判正環}}

}return

true;}

intmain()

}for

(i=1

;i<=n;

++i)if(

!vis[i]&&!

spfa

(i))

return

puts

("no"),

0;//如果某個聯通塊內出現了正環,輸出no並退出程式

return

puts

("yes"),

0;//輸出yes

}

洛谷P1993 小K的農場 差分約束

對於n nn個物品,給出m mm個限制關係,分別是 1.a aa比b bb至少多種c cc單位的作物。2.a aa比b bb至多多種c cc單位的作物。3.a aa和b bb的作物數相等。求問是否滿足這樣的一種情形,符合所有的限制關係。不妨記f f f 表示 的作物數,顯然各條件等價於 1.f a ...

洛谷P1993 小K的農場 差分約束

小k在mc裡面建立很多很多的農場,總共n n個,以至於他自己都忘記了每個農場中種植作物的具體數量了,他只記得一些含糊的資訊 共m m個 以下列三種形式描述 但是,由於小k的記憶有些偏差,所以他想要知道存不存在一種情況,使得農場的種植作物數量與他記憶中的所有資訊吻合。顯然差分約束。條件1 a b c ...

洛谷P1993 小K的農場 差分約束系統

題目傳送門 小k在mc裡面建立很多很多的農場,總共n個,以至於他自己都忘記了每個農場中種植作物的具體數量了,他只記得一些含糊的資訊 共m個 以下列三種形式描述 但是,由於小k的記憶有些偏差,所以他想要知道存不存在一種情況,使得農場的種植作物數量與他記憶中的所有資訊吻合。輸入格式 第一行包括兩個整數 ...