BZOJ 1077 天平 (差分約束)

2021-08-08 10:42:10 字數 2036 閱讀 1216

time limit: 10 sec memory limit: 162 mb

description

你有n個砝碼,均為1克,2克或者3克。你並不清楚每個砝碼的重量,但你知道其中一些砝碼重量的大小關係。

你把其中兩個砝碼a和b放在天平的左邊,需要另外選出兩個砝碼放在天平的右邊。問:有多少種選法使得天平的左

邊重(c1)、一樣重(c2)、右邊重(c3)?(只有結果保證惟一的選法才統計在內)

input

第一行包含三個正整數n,a,b(1<=a,b<=n,a和b不相等)。砝碼編號為1~n。以下n行包含重量關係矩陣,

其中第i行第j個字元為加號「+」表示砝碼i比砝碼j重,減號「-」表示砝碼i比砝碼j輕,等號「=」表示砝碼i和砝

碼j一樣重,問號「?」表示二者的關係未知。存在一種情況符合該矩陣

output

僅一行,包含三個整數,即c1,c2和c3。

sample input

6 2 5

sample output

1 4 1

hint

【資料規模】 4<=n<=50

思路:

摘自大佬 < clover_hxy >

這道題n的範圍很小,所以我們可以考慮列舉+判定

設放在天平右邊的是c,d.

以a+b < c+d為例,因為差分約束必須是差的形式,所以我們將式子變形為b−c < d−a然後列舉d,a的取值,就得到了乙個關於兩個數差的不等式。設列舉的a的值為x,那麼x<=a<=x這個式子要想轉換成差分的形式,需要引入乙個新變數0,設dis[0]=0,那麼式子可以變成x<=a−0<=x

注意每個點都只能從[1,3]中取值,所以隱含的限制就是1<=dis[i]−dis[0]<=3。

題目中說只有結果保證惟一的選法才統計在內,意思是對於同一對c,d只能計算一次,且如果列舉的c,d的值不同,得到的與a+b的關係不同的話,那麼方案不合法。

如果對於差分約束的轉換有疑惑

#include 

#include

#include

#include

#include

#define n 100010

#define inf 1000000000

using

namespace

std;

int n, b, a, idc;

int ans[5], head[n], vis[n], dis[n], rec[10];

bool flag;

struct edge ed[n];

void adde(int u, int v, int w)

void spfa(int u)

spfa( v );

if( flag ) return;}}

vis[u] = 0;

}void init(int c, int d)

void recover(int c, int d)

bool check1(int c, int d, int vd, int va)

bool check2(int c, int d, int vd, int va)

bool check3(int c, int d, int vd, int va)

int main()

}for(int i=1; i<=n; i++) adde(0, i, 3), adde(i, 0, -1);//限定所有元素在1~3

for(int i=1; ifor(int j=i+1; j<=n; j++)

}if(v1 && !v2 && !v3) ans[1]++;

if(!v1 && v2 && !v3) ans[2]++;//因為只有結果保證惟一的選法才統計在內

if(!v1 && !v2 && v3) ans[3]++;//如果列舉的c,d的值不同,得到的與a+b的關係不同的話,那麼方案不合法。

}printf("%d %d %d\n", ans[2], ans[3], ans[1]);

return

0;}

BZOJ 2330 差分約束系統

差分約束系統是用最短路的三角不等式來得到題目中給定的不等式的一組解,具體來說,最短路中的不等式為if dis v dis u len p dis v dis u len p 假設題目中給定不等式a b 5,那麼轉換的不等式即為if dis a dis b 5 dis a dis b 5,這樣就把數學...

bzoj2330 差分約束 糖果

description 幼兒園裡有n個小朋友,lxhgww老師現在想要給這些小朋友們分配糖果,要求每個小朋友都要分到糖果。但是小朋友們也有嫉妒心,總是會提出一些要求,比如小明不希望小紅分到的糖果比他的多,於是在分配糖果的時候,lxhgww需要滿足小朋友們的k個要求。幼兒園的糖果總是有限的,lxhgw...

BZOJ 4500 矩陣 差分約束

4500 矩陣 有乙個n m的矩陣,初始每個格仔的權值都為0,可以對矩陣執行兩種操作 選擇一行,該行每個格仔的權值加1或減1。選擇一列,該列每個格仔的權值加1或減1。現在有k個限制,每個限制為乙個三元組 x,y,c 代 子 x,y 權值等於c。問是否存在乙個操作序列,使得操作完後的矩陣滿足所有的限制...