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
實際上上面的不等式組恰好可以看成一條路徑,每個不等式即路徑上的一小段。(路徑總長等於每段路徑長度之和)
#includeusingnamespace
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,...