點此看題面
大致題意:給你若干組不等式,請你判斷它們是否有解。
差分約束系統
看到若干組不等式,應該很容易想到差分約束系統吧。
a−bl in
klink
link
差分約束系統詳見部落格**差分約束系統
≥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的記憶有些偏差,所以他想要知道存不存在一種情況,使得農場的種植作物數量與他記憶中的所有資訊吻合。輸入格式 第一行包括兩個整數 ...