bzoj 4500 矩陣 差分約束系統

2022-02-27 10:16:15 字數 1157 閱讀 6369

description

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

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

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

現在有k個限制,每個限制為乙個三元組(x,y,c),代**子(x,y)權值等於c。

問是否存在乙個操作序列,使得操作完後的矩陣滿足所有的限制。如果存在輸出」yes」,否則輸出」no」。

如果我們將所有的行作為變數\(x\),所有的列作為變數\(y\).

變數本身代表對這行(列)進行的運算元(x,y可以為負)

所以對於每乙個三元限制我們可以列出方程\(x_i + y_i = c_i\)

然後我們移項得到\(x_i - c_i = y_i\)

這樣我們可以依據這個等式列出兩個不等式:

然後我們建立差分約束系統,dfs判正環即可.

#include #include #include using namespace std;

typedef long long ll;

inline void read(int &x)

const int maxn = 2048;

const int maxm = 1024*1024;

struct edgeg[maxm];

int head[maxn],cnt;

void add(int u,int v,int d)

int dis[maxn];bool inq[maxn];

inline void init()

#define v g[i].to

bool dfs(int u)

}inq[u] = false;

return true;

}#undef v

int x[maxn],y[maxn],c[maxn];

int work()

if(y[i] == y[j] && c[i] - c[j] >= 0)}}

for(int i=1;i<=n+m;++i) if(!dfs(i)) return puts("no");

return puts("yes");

}int main()

BZOJ 4500 矩陣 差分約束

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

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 ...