小q是乙個非常聰明的孩子,除了西洋棋,他還很喜歡玩乙個電腦益智遊戲——矩陣遊戲。矩陣遊戲在乙個n
*n黑白方陣進行(如同西洋棋一般,只是顏色是隨意的)。每次可以對該矩陣進行兩種操作:行交換操作:選擇
矩陣的任意兩行,交換這兩行(即交換對應格仔的顏色)列交換操作:選擇矩陣的任意行列,交換這兩列(即交換
對應格仔的顏色)遊戲的目標,即通過若干次操作,使得方陣的主對角線(左上角到右下角的連線)上的格仔均為黑
色。對於某些關卡,小q百思不得其解,以致他開始懷疑這些關卡是不是根本就是無解的!!於是小q決定寫乙個程
序來判斷這些關卡是否有解。
第一行包含乙個整數t,表示資料的組數。接下來包含t組資料,每組資料第一行為乙個整數n,表示方陣的大
小;接下來n行為乙個n*n的01矩陣(0表示白色,1表示黑色)。
輸出檔案應包含t行。對於每一組資料,如果該關卡有解,輸出一行yes;否則輸出一行no。22
0 00 1
30 0 1
0 1 0
1 0 0
noyes
【資料規模】
對於100%的資料,n ≤ 200
一道比較明顯的網路流(二分圖吧)
然而我並沒有看出來
真的菜啊
其實這種涉及行和列的一些操作的就可能是網路流
對於這道題
會發現無論怎麼變換原來在同一行或同一列的都還會在同一行或同一列
但是又要求每一行和每一列都至少要有乙個
所以就二分圖
左邊是行,右邊是列
對乙個位於i,j的黑色點從左邊i連向右邊j
注意:不能連雙向邊(剛開始沒仔細想,隨便連了乙個雙向邊就wa了)
然後就跑匈牙利啦
還有乙個小經驗
就是隨機資料對拍可能有些發現不了的錯誤
所以可以盡量造一些比較有可能錯的點
比如這題
如果黑點很稠密
那可能就比較容易跑對
所以我們可以造一些稀疏一點的圖
#include#includeconst int n=205;
int e[n][n],n;int y[n],visit[n];
int dfs(int v)
}return 0;
}int main()
for(int i=1;i<=n;i++)
if(ans==n) printf("yes\n");
else printf("no\n");
}return 0;
}
ZJOI2007 BZOJ1059 矩陣遊戲
description 第一行包含乙個整數t,表示資料的組數。接下來包含t組資料,每組資料第一行為乙個整數n,表示方陣的大小 接下來n行為乙個n n的01矩陣 0表示白色,1表示黑色 output 輸出檔案應包含t行。對於每一組資料,如果該關卡有解,輸出一行yes 否則輸出一行no。sample i...
bzoj 1059 ZJOI2007 矩陣遊戲
之前好像做過原題 就是二分匹配,無論怎麼交換只要有任何兩個1都不同行不同列就可以構造出答案,那就匈牙利模板吧 include include include include include includeusing namespace std define ll long long define f...
BZOJ 1059 ZJOI2007 矩陣遊戲
第一行包含乙個整數t,表示資料的組數。接下來包含t組資料,每組資料第一行為乙個整數n,表示方陣的大 小 接下來n行為乙個n n的01矩陣 0表示白色,1表示黑色 輸出檔案應包含t行。對於每一組資料,如果該關卡有解,輸出一行yes 否則輸出一行no。0 00 1 0 0 1 0 1 0 1 0 0 n...