BZOJ1059 / ZJOI2007 矩阵游戏【网络流/二分图】
来源:互联网 发布:淘宝代理商怎么找 编辑:程序博客网 时间:2024/06/08 15:25
Description
小Q很喜欢玩矩阵游戏。矩阵游戏在一个
Input
第一行包含一个整数
Output
输出文件应包含
Solution
首先了解以下四个结论:
在同一行的两个数经过变换不会到不同行
在同一列的两个数经过变换不会到不同列在不同行的两个数经过变换不会到同一行
在不同列的两个数经过变换不会到同一列
(以上结论脑补即可证明)
接下来是一些简单的推导:
由于最终结果是主对角线上全是
若我们从初始局面中可以找到
那么题目变成:是否可以找到
这样就完全变成了一个简单的二分图匹配,每个黑点
如果这张图有完美匹配,就说明符合了条件。
代码:
#include <iostream>#include <algorithm>#include <cstdio>#include <cstring>using namespace std;const int maxn = 100000 + 5;const int INF = (int)1e9;int edge_num = 1, m, n, S, T;int hed[maxn], dep[maxn];struct Edge { int from, to, nxt, c;} edge[maxn * 4];void addedge(int from, int to, int c){ edge[++edge_num].nxt = hed[from]; edge[edge_num].from = from; edge[edge_num].to = to; hed[from] = edge_num; edge[edge_num].c = c;}void adde(int from, int to, int c){ addedge(from, to, c); addedge(to, from, 0);}int queue[maxn], head = 0, tail = 0;bool bfs(){ queue[head] = S; head = tail = 0; memset(dep, 0, sizeof(dep)); dep[S] = 1; while (head <= tail){ int cur = queue[head]; head++; for (int i = hed[cur]; i; i = edge[i].nxt){ int to = edge[i].to; if (!dep[to] && edge[i].c) { dep[to] = dep[cur] + 1; queue[++tail] = to; } } } return dep[T];}int dfs(int x, int flow){ if (x == T) return flow; int ret = 0; for (int i = hed[x]; i; i = edge[i].nxt){ int to = edge[i].to; if (dep[to] == dep[x] + 1 && edge[i].c){ int tmp = dfs(to, min(flow, edge[i].c)); edge[i].c -= tmp; edge[i ^ 1].c += tmp; flow -= tmp; ret += tmp; } } if (!ret) dep[x] = 0; return ret;}int dinic(){ int ret = 0; while (bfs()){ ret += dfs(S, INF); } return ret;}void init(){ memset(hed, 0, sizeof hed); edge_num = 1;}int main(){ int t; scanf("%d", &t); while(t--){ init(); scanf("%d", &n); S = 0; T = 2 * n + 1; for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++){ int x; scanf("%d", &x); if (x == 1) adde(i, j + n, 1); } for (int i = 1; i <= n; i++){ adde(S, i, 1); adde(i + n, T, 1); } puts(dinic() == n ? "Yes" : "No"); } return 0;}
- BZOJ1059 / ZJOI2007 矩阵游戏【网络流/二分图】
- [BZOJ1059][ZJOI2007][二分图匹配]矩阵游戏
- bzoj1059: [ZJOI2007]矩阵游戏 二分图
- [BZOJ1059]ZJOI2007矩阵游戏|二分图匹配
- 【bzoj1059】 ZJOI2007矩阵游戏 二分图匹配
- 【bzoj1059】【zjoi2007】【矩阵游戏】【二分图匹配】
- 【BZOJ1059】[ZJOI2007]矩阵游戏【二分图匹配】
- [BZOJ1059] [ZJOI2007] 矩阵游戏 - 二分图匹配
- 【BZOJ1059】[ZJOI2007][二分图匹配]矩阵游戏
- bzoj1059: [ZJOI2007]矩阵游戏 二分图匹配
- bzoj1059: [ZJOI2007]矩阵游戏(网络流 或 二分图匹配)[省选计划系列]
- [BZOJ1059][ZJOI2007]矩阵游戏(二分图匹配)
- [二分图最大匹配] BZOJ1059: [ZJOI2007]矩阵游戏
- 二分图匹配——BZOJ1059/Luogu1129 [ZJOI2007]矩阵游戏
- [BZOJ1059][ZJOI2007]矩阵游戏(二分图匹配)
- 【bzoj1059 ZJOI2007】矩阵游戏(二分图匹配)
- BZOJ1059(ZJOI2007)[矩阵游戏]--二分图最大匹配
- bzoj1059: [ZJOI2007]矩阵游戏(二分图匹配)
- mysql-connector-java 6.x 时区设置
- JDBC学习之路-入门
- Java中的多线程你只要看这一篇就够了
- angular4基础之服务与依赖注入
- 动手实现一个轻量级无侵入性的RxJava自动注销库RxLifecycle
- BZOJ1059 / ZJOI2007 矩阵游戏【网络流/二分图】
- android 启动屏幕 ==> splash screen
- Ionic3学习笔记(一)安装、项目结构与常用命令
- HDU 1754 线段树
- Bootstrap之带标题的面板
- 【Node事件模块Events】
- CommonJS规范
- Java 9升级后,eclipse出现的问题及解决
- 利用事件委托解决js元素添加后未响应绑定事件问题