1. 程式人生 > >BZOJ 1059 矩陣遊戲 二分圖匹配

BZOJ 1059 矩陣遊戲 二分圖匹配

不可 false 外掛 space 象棋 對角線 sizeof 決定 blank

題目鏈接:

https://www.lydsy.com/JudgeOnline/problem.php?id=1059

題目大意:

小Q是一個非常聰明的孩子,除了國際象棋,他還很喜歡玩一個電腦益智遊戲——矩陣遊戲。矩陣遊戲在一個N *N黑白方陣進行(如同國際象棋一般,只是顏色是隨意的)。每次可以對該矩陣進行兩種操作:行交換操作:選擇 矩陣的任意兩行,交換這兩行(即交換對應格子的顏色)列交換操作:選擇矩陣的任意行列,交換這兩列(即交換 對應格子的顏色)遊戲的目標,即通過若幹次操作,使得方陣的主對角線(左上角到右下角的連線)上的格子均為黑 色。對於某些關卡,小Q百思不得其解,以致他開始懷疑這些關卡是不是根本就是無解的!!於是小Q決定寫一個程
序來判斷這些關卡是否有解。 思路: 每一行必須匹配某一列才是有解的,所以可以二分圖匹配來做。
 1 #include<bits/stdc++.h>
 2 #define IOS ios::sync_with_stdio(false);//不可再使用scanf printf
 3 #define Max(a, b) ((a) > (b) ? (a) : (b))//禁用於函數,會超時
 4 #define Min(a, b) ((a) < (b) ? (a) : (b))
 5 #define Mem(a) memset(a, 0, sizeof(a))
 6 #define Dis(x, y, x1, y1) ((x - x1) * (x - x1) + (y - y1) * (y - y1))
 7
#define MID(l, r) ((l) + ((r) - (l)) / 2) 8 #define lson ((o)<<1) 9 #define rson ((o)<<1|1) 10 #pragma comment(linker, "/STACK:102400000,102400000")//棧外掛 11 using namespace std; 12 inline int read() 13 { 14 int x=0,f=1;char ch=getchar(); 15 while (ch<0||ch>9){if (ch==-) f=-1;ch=getchar();}
16 while (ch>=0&&ch<=9){x=x*10+ch-0;ch=getchar();} 17 return x*f; 18 } 19 20 typedef long long ll; 21 const int maxn = 500 + 10; 22 const int MOD = 1000000007;//const引用更快,宏定義也更快 23 const int INF = 1e9 + 7; 24 const double eps = 1e-6; 25 int Map[maxn][maxn]; 26 int cx[maxn], cy[maxn]; 27 bool vis[maxn]; 28 int n; 29 bool dfs(int u) 30 { 31 for(int v = 1; v <= n; v++) 32 if(Map[u][v] && !vis[v]) 33 { 34 vis[v] = 1; 35 if(cy[v] == -1 || dfs(cy[v])) 36 { 37 cx[u] = v; 38 cy[v] = u; 39 return 1; 40 } 41 } 42 return 0; 43 } 44 int maxmatch() 45 { 46 int ans = 0; 47 memset(cx, -1, sizeof(cx)); 48 memset(cy, -1, sizeof(cy)); 49 for(int i = 1; i <= n; i++) 50 { 51 if(cx[i] == -1) 52 { 53 memset(vis, 0, sizeof(vis)); 54 ans += dfs(i); 55 } 56 } 57 return ans; 58 } 59 60 int main() 61 { 62 int T; 63 scanf("%d", &T); 64 while(T--) 65 { 66 memset(Map, 0, sizeof(Map)); 67 scanf("%d", &n); 68 int x; 69 for(int i = 1; i <= n; i++)for(int j = 1; j <= n; j++) 70 { 71 scanf("%d", &x); 72 if(x)Map[i][j] = 1; 73 } 74 if(maxmatch() == n)puts("Yes"); 75 else puts("No"); 76 } 77 return 0; 78 }

BZOJ 1059 矩陣遊戲 二分圖匹配