luogu1993 小K的農場 差分約束

2022-05-16 02:07:39 字數 1250 閱讀 7526

1993 小k的農場

存一下 不想打字...

1、a-b\geq ca−b≥c,建邊w[b,a]=c(表示a比b大c)

2、a−b≤c即b≥a−c,建邊w[a,b]=-c(表示b比a小c,注意不能建邊w[b,a]=c因為這和第乙個約束衝突,所以反過來就好了)

3、a==b時,建邊w[a,b]=w[b,a]=0(表示a和b相等)

然後從0向i=1~n每個點連邊w[0,i]=0(隨便值為多少,反正只是驗證可行性)

最後跑spfa求最長路,出現環則輸出no,否則輸出yes

對於多個不等式組:

v(x1) - v(x2) >= c1

v(x2) - v(x3) >= c2

把它們加起來就會得到:v(x1) - v(xn) >= c1 + c2 + …… + cn-1

實際上上面的不等式組恰好可以看成一條路徑,每個不等式即路徑上的一小段。(路徑總長等於每段路徑長度之和)

#includeusing

namespace

std;

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

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

#define ll long long

#define rg register

const

int n= 10000+5,m=1000000+5,inf=0x3f3f3f3f,p=9999973

;int n,m,dis[n],flag=1

;template

void rd(t &x)

int head[n],tot=0

;struct edgee[m<<1

];void add(int u,int v,int

w),head[u]=tot;

}bool

in[n];

void dfs(int

u) dfs(v);}}

in[u]=0;}

intmain()

for(int i=1;i<=n;++i) add(0,i,0

); dis[

0]=0

; dfs(0);

if(flag) puts("

yes"

);

else puts("no"

);

return0;

}

P1993 小K的農場(差分約束)

小k的農場 題目描述 小k在mc裡面建立很多很多的農場,總共n個,以至於他自己都忘記了每個農場中種植作物的具體數量了,他只記得一些含糊的資訊 共m個 以下列三種形式描述 農場a比農場b至少多種植了c個單位的作物,農場a比農場b至多多種植了c個單位的作物,農場a與農場b種植的作物數一樣多。但是,由於小...

差分約束 P1993 小 K 的農場

建立乙個超級源點s,使得dis x dis i 然後就可以建邊 a b 可以拆成b a 之後再跑spfa,判斷是否有負環,有負環則說明不能滿足,無負環則能滿足 includeusing namespace std const int maxm 5005 const int inf 0x3f3f3f3...

P1993 小K的農場 差分約束

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