[ZJOI2007]矩阵游戏 洛谷1129 bzoj 1059 网络流
2018-01-11 21:02
337 查看
题目
小Q是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏――矩阵游戏。矩阵游戏在一个N*N黑白方阵进行(如同国际象棋一般,只是颜色是随意的)。每次可以对该矩阵进行两种操作:行交换操作:选择矩阵的任意两行,交换这两行(即交换对应格子的颜色)
列交换操作:选择矩阵的任意两列,交换这两列(即交换对应格子的颜色)
游戏的目标,即通过若干次操作,使得方阵的主对角线(左上角到右下角的连线)上的格子均为黑色。
对于某些关卡,小Q百思不得其解,以致他开始怀疑这些关卡是不是根本就是无解的!!于是小Q决定写一个程序来判断这些关卡是否有解。
分析
类似的问题都可以直接想网络流把黑点的(i,j)的i,j连边跑最大流,如果答案是n,那就是yes
code
#include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<queue> using namespace std; struct arr{ int x,y,w,next; }edge[2000000]; int ls[410000],cur[410000]; int f[2100000]; int edge_m=1; int n,m,s,t; int ans,num=0; void add(int x,int y,int w) { edge[++edge_m]=(arr){x,y,w,ls[x]}; cur[y]=ls[x]=edge_m; f[edge_m]=w; edge[++edge_m]=(arr){y,x,w,ls[y]}; cur[y]=ls[y]=edge_m; f[edge_m]=0; } int dis[400000]; bool bfs() { memset(dis,-1,sizeof(dis)); queue<int> q; q.push(s); dis[s]=0; do{ int x=q.front(); q.pop(); for (int i=ls[x];i!=0;i=edge[i].next) { if ((f[i])&&(dis[edge[i].y]==-1)) { dis[edge[i].y]=dis[x]+1; q.push(edge[i].y); if (edge[i].y==t) return true; } } }while (!q.empty()); return false; } int find(int x,int min_) { if (x==t) return min_; int rec=min_; for (int &i=cur[x];i!=0;i=edge[i].next) { if ((f[i])&&(dis[edge[i].y]==dis[x]+1)) { int k=find(edge[i].y,min(min_,f[i])); f[i]-=k; f[i^1]+=k; rec-=k; if (rec==0) return min_; } } if (rec==min_) dis[x]=-1; return min_-rec; } int dinic() { ans=0; while (bfs()) { for (int i=0;i<=t;i++) cur[i]=ls[i]; ans+=find(s,20000000); } } int T; int main() { scanf("%d",&T); while (T--) { scanf("%d",&n); memset(edge,0,sizeof(edge)); memset(ls,0,sizeof(ls)); memset(f,0,sizeof(f)); edge_m=1; for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) { int x; scanf("%d",&x); if (x==1) add(i,j+n,1); } s=2*n+1; t=2*n+2; for (int i=1;i<=n;i++) { add(s,i,1); add(i+n,t,1); } dinic(); if (ans==n) printf("Yes\n"); else printf("No\n"); } }
相关文章推荐
- bzoj 1059: [ZJOI2007]矩阵游戏 网络流
- 洛谷 P1129 BZOJ 1059 cogs 660 [ZJOI2007]矩阵游戏
- bzoj1059: [ZJOI2007]矩阵游戏(网络流 或 二分图匹配)[省选计划系列]
- BZOJ1059 / ZJOI2007 矩阵游戏【网络流/二分图】
- bzoj 1059: [ZJOI2007]矩阵游戏【匈牙利算法】
- [BZOJ1059][ZJOI2007]矩阵游戏(二分图匹配)
- 【洛谷1129】 [ZJOI2007]矩阵游戏
- bzoj1059: [ZJOI2007]矩阵游戏
- bzoj1059 [ZJOI2007]矩阵游戏
- 1059: [ZJOI2007]矩阵游戏 - BZOJ
- bzoj1059[ZJOI2007]矩阵游戏
- 12.7 bzoj1059[ZJOI2007]矩阵游戏
- [BZOJ]1059: [ZJOI2007]矩阵游戏
- [二分图最大匹配] BZOJ1059: [ZJOI2007]矩阵游戏
- BZOJ1059【ZJOI2007】矩阵游戏
- bzoj1059 [ZJOI2007]矩阵游戏(二分图完美匹配)
- bzoj 1059: [ZJOI2007]矩阵游戏(匈牙利算法)
- [BZOJ1059][ZJOI2007]矩阵游戏
- bzoj1059 [ZJOI2007]矩阵游戏
- bzoj 1059: [ZJOI2007]矩阵游戏(二分匹配)