BZOJ 4500 矩陣 差分約束

2021-09-07 06:18:58 字數 955 閱讀 4011

4500: 矩陣

有乙個n*m的矩陣,初始每個格仔的權值都為0,可以對矩陣執行兩種操作:

選擇一行, 該行每個格仔的權值加1或減1。

選擇一列, 該列每個格仔的權值加1或減1。

現在有k個限制,每個限制為乙個三元組(x,y,c),代**子(x,y)權值等於c。問是否存在乙個操作序列,使得操作完後的矩陣滿足所有的限制。如果存在輸出」yes」,否則輸出」no」。

先輸入乙個t(t <= 5)代表輸入有t組資料,每組資料格式為:

第一行三個整數n, m, k (1 <= n, m,k <= 1000)。

接下來k行,每行三個整數x, y, c。

對於每組資料,輸出yes或者no。

2 2 4

1 1 0

1 2 0

2 1 2

2 2 2

2 2 4

1 1 0

1 2 0

2 1 2

2 2 1

yesno

簡單想一想,其實發現就是2000個點的差分約束,然後跑一遍dfs就好了

x,y,z表示x+z=y,y-z=x,然後建邊就好了

#includeusing namespace std;

const int maxn = 2005;

vector> e[maxn];

int n,m,k;

int vis[maxn],d[maxn];

int flag;

void init()

else

}}void solve()

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

if(!vis[i])

dfs(i);

if(flag)printf("no\n");

else printf("yes\n");

}int main()

BZOJ4500 矩陣(差分約束)

bzoj 然而許可權題 顯然拆分行和列。不妨設這一行 列總共加減的值是 p 那麼每乙個限制就是兩個數的和為乙個特定的數。這樣子不好做,反正是乙個二分圖,那麼把列的 p 變成 p 這樣就變成了差是乙個定製,直接差分約束判斷一下就好了。include includeusing namespace std...

BZOJ 4500 矩陣 差分約束

從行向列建邊,代表乙個格仔a i j 對每個頂點的所有操作可以合併在一起用sum xi 表示,那麼題目相當於是要求sum xi sum xj a xi xj 等價於 sum xj sum xi a xi xj 等價於 sum xj sum xi a xi xj sum xj sum xi a xi ...

bzoj4500 矩陣 差分約束系統

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