小Q是一個非常聰明的孩子,除了國際象棋,他還很喜歡玩一個電腦益智游戲——矩陣游戲。矩陣游戲在一個N*N黑白方陣進行(如同國際象棋一般,只是顏色是隨意的)。每次可以對該矩陣進行兩種操作:行交換操作:選擇矩陣的任意兩行,交換這兩行(即交換對應格子的顏色)列交換操作:選擇矩陣的任意行列,交換這兩列(即交換對應格子的顏色)游戲的目標,即通過若干次操作,使得方陣的主對角線(左上角到右下角的連線)上的格子均為黑色。對於某些關卡,小Q百思不得其解,以致他開始懷疑這些關卡是不是根本就是無解的!!於是小Q決定寫一個程序來判斷這些關卡是否有解。
第一行包含一個整數T,表示數據的組數。接下來包含T組數據,每組數據第一行為一個整數N,表示方陣的大小;接下來N行為一個N*N的01矩陣(0表示白色,1表示黑色)。
輸出文件應包含T行。對於每一組數據,如果該關卡有解,輸出一行Yes;否則輸出一行No。
#include#include #include #include using namespace std; struct node{ int next,to; }e[40010]; int match[410],p[410],T,i,j,n,tot; bool visit[410]; void add(int u,int v) { e[++tot].to=v; e[tot].next=p[u]; p[u]=tot; } bool dfs(int u) { for (int i=p[u]; i!=0; i=e[i].next) { int v=e[i].to; if (!visit[v]) { visit[v]=true; if (match[v]==0 || dfs(match[v])) { match[v]=u; return true; } } } return false; } int main() { scanf("%d",&T); while (T--) { tot=0; memset(match,0,sizeof(match)); memset(p,0,sizeof(p)); scanf("%d",&n); for (i=1; i<=n; i++) for (j=1; j<=n; j++) { int c; scanf("%d",&c); if (c==1) add(i,j+n); } for (i=1; i<=n; i++) { memset(visit,false,sizeof(visit)); if (!dfs(i)) break; } if (i>n) printf("Yes\n"); else printf("No\n"); } }