矩陣遊戲 bzoj1059 網路流

2021-07-25 21:00:21 字數 1400 閱讀 3659

第一行包含乙個整數t,表示資料的組數。接下來包含t組資料,每組資料第一行為乙個整數n,表示方陣的大

小;接下來n行為乙個n*n的01矩陣(0表示白色,1表示黑色)。

輸出檔案應包含t行。對於每一組資料,如果該關卡有解,輸出一行yes;否則輸出一行no。

首先說明,同行同列的黑格仔不可能通過某種轉換變得在對角線上

那麼接下來就簡單了,題目變成求是否有n個不同行同列的不同黑格仔存在

連邊求最大匹配

還有就是,**裡面我用e[i]和e[i^1]表示兩條對邊,如果邊從1開始算起的話,那麼1^1=0,也就是它的對邊變成了不存在的第0條邊。

因此我們把初始edgecnt = 1就可以a了

#include 

#include

#include

#define rep(i, a, b) for (int i = a; i <= b; i ++)

#define fill(x, t) memset(x, t, sizeof(x))

#define n 505

#define e n * n * 2 + 1

#define inf 0x3f3f3f3f

using

namespace

std;

struct edgee[e];

int cur[n], dis[n], ls[n], edgecnt;

inline

int read()

ch = getchar();

}while (ch <='9' && ch >= '0')

return x * v;

}int min(int x, int y); ls[x] = edgecnt;

e[++edgecnt] = (edge); ls[y] = edgecnt;

return0;}

int bfs(int st, int ed)}}

}return0;}

int find(int now, int ed, int mn)

int ret = 0;

for (int &i = cur[now]; i; i = e[i].next)}}

return ret;

}int dinic(int n, int st, int ed)

mxflow += find(st, ed, inf);

}return mxflow;

}int main(void)}}

int st = 0, ed = n + n + 1;

rep(i, 1, n)

int ans = dinic(n, st, ed);

if (ans == n)else

}return

0;}

bzoj1059 矩陣遊戲

time limit 10 sec memory limit 162 mb submit 4731 solved 2255 submit status discuss 矩陣的任意兩行,交換這兩行 即交換對應格仔的顏色 列交換操作 選擇矩陣的任意行列,交換這兩列 即交換 對應格仔的顏色 遊戲的目標,即...

bzoj1059 矩陣遊戲

二分圖匹配經典題。因為每一行的點不管如何交換也不會不在同一行,同理,同一列的點無論如何交換都仍然在這一列。那麼也就是說要選則一些點使得滿足題意,那麼就可以去跑匹配了。若a i j 是黑色的,那麼就從i行向j列連邊,最後跑匹配。如果用邊表的話一定要記得清空計數器。不然就炸了。1 include 2 i...

BZOJ1059 矩陣遊戲

目錄題目傳送門 剛開始理解錯題意了,以為除了主對角線上之外都不能有 後來發現只要主對角線上可以都是 就是合法的了。實際上的題意就是讓你判斷 n 行與 n 列是否可以都匹配上,這樣就是乙個比較簡單的二分圖匹配,如果第 i,j 位置上為 就說明第 i 行與第 j 行能夠匹配,然後跑一遍匈牙利就行了。in...