描述

你有足够多的象棋“车”,在一个n×n的棋盘上你能放多少个“车”呢?注意,所给棋盘上有些位置不能放任何东西。同时,某一行(列)最多只能存在一个“车”。

输入

第一行为一个正整数n。(1<=n<=500 )

接下来n行,每行包含n个整数,若为0表示这个位置不能放“车”;若为1表示这个位置可以放“车”。

输出

输出一个整数,表示最多能放多少个“车”。

样例输入

5
1 0 0 0 0
0 0 0 0 0
0 0 0 1 0
1 1 0 1 0
0 0 0 1 0

样例输出

3

样例解释

将行看作X集合,列看作Y集合

若棋盘上为1的位置有(i,j),则X集的第i个点向Y集的第j个点连边

#include <bits/stdc++.h>
using namespace std;const int N = 505*2, M= N * N;
struct E{//next:下一条邻接边//to:本条边所指向的终点int next,to;
}e[M];
//ihead:邻接表的头
//cnt:邻接表大小
//mc:表示每个点所匹配到的另一个点match
//vis:Y集元素是否被访问过
int cnt,ihead[N],mc[N];
bool vis[N];
//邻接表连边,表示连一条x到y的有向边
//x:起点
//y:终点
void add(int x,int y){++cnt;e[cnt].next = ihead[x];e[cnt].to = y;ihead[x] = cnt;
}
//匈牙利算法
//x:x集上的点,从当前点出发找增广路
//返回值:若找到增广路则返回true,否则返回false
bool dfs(int x){for(int i=ihead[x]; i!=0; i=e[i].next){int y = e[i].to;if(!vis[y]){//如果找到一个Y集上的点没有标记vis[y] = true;//标记该点//如果y是没有匹配点的,说明找到了一条增广路;或者说递归查找y的匹配点,得到了一条增广路if(mc[y] == 0 || dfs(mc[y])){//找到了增广路,更新mc数组mc[x] = y;mc[y] = x;return true;}}}return false;
}
// 求解棋盘上最多能放多少个“车”
// n:棋盘的大小为n×n的
// board:所给棋盘,对于某个位置上的数:若值为1表示可以放“车”;若值为0表示不能放“车”
// 返回值:能放“车”的最大个数
int getAnswer( int n, vector<vector<int>> board) {//将行看作n个点,将列看作另外n个点,标号分别是1到n和n+1到2ncnt = 0;for(int i=1; i <= n * 2; ++i){ihead[i] = 0;mc[i] = 0;}//连边for(int i = 1; i <= n; ++i)for(int j = 1; j <= n; ++j)if(board[i-1][j-1] == 1)add(i,j+n);int ans = 0;for(int i=1; i<=n; ++i)if(!mc[i]){//如果x集中的第i个点没有匹配到Y集上的点,则从这个点出发寻找增广路memset(vis, 0, sizeof(bool) * (n * 2 + 1));//将数组置为0if(dfs(i))++ans;//如果找到,答案直接+1}return ans;
}int main() {int n;scanf("%d", &n);vector<vector<int>> e;for (int i = 0; i < n; ++i) {vector<int> t;for (int j = 0; j < n; ++j) {int x;scanf("%d", &x);t.push_back(x);}e.push_back(t);}printf("%d\n", getAnswer(n, e));return 0;
}

清华大学算法训练营 —— 象棋相关推荐

  1. 覃超-算法训练营 学习方法分享[1] 如何精通一个领域

    转载说明:文章内容来自 极客大学算法训练营. 版权归极客大学.覃超老师以及算法训练营的小伙伴所有.如有涉及侵权,请联系我删除,谢谢. 文章目录 精通一个领域的三步走方式 切碎知识点 1. 切碎知识点 ...

  2. 算法训练营 重编码_编码训练营后如何找到工作

    算法训练营 重编码 by Roxy Ayaz 由Roxy Ayaz 编码训练营后如何找到工作 (How to get a job after a coding bootcamp) Getting a ...

  3. 算法训练营 重编码_您在编码训练营期间可能面临的最大挑战

    算法训练营 重编码 by Joanna Gaudyn 乔安娜·高登(Joanna Gaudyn) 您在编码训练营期间可能面临的最大挑战 (The biggest struggles you might ...

  4. 算法训练营 重编码_编码训练营适合您吗?

    算法训练营 重编码 by Joanna Gaudyn 乔安娜·高登(Joanna Gaudyn) 编码训练营适合您吗? (Is a Coding Bootcamp something for you? ...

  5. 算法训练营 重编码_编码训练营之后该做什么-以及如何获得成功

    算法训练营 重编码 by Anthony Morris 安东尼·莫里斯(Anthony Morris) 编码训练营之后该做什么-以及如何获得成功 (What to do - and how to fi ...

  6. 算法训练营 重编码_参加编码训练营之前要考虑的7件事

    算法训练营 重编码 Coding bootcamps are becoming more and more popular, and for good reason. Just picture you ...

  7. 算法训练营 重编码_关于如何在没有训练营的情况下学习编码的10条提示

    算法训练营 重编码 Seattle 2017. I had just attended my first team meeting at my first job as a software deve ...

  8. 算法训练营 重编码_编码训练营后十四天如何找到工作

    算法训练营 重编码 Fourteen days after I graduated from my coding bootcamp, I had a job offer. Two weeks afte ...

  9. 算法训练营 day20 二叉树 最大二叉树 合并二叉树 二叉搜索树中的搜索 验证二叉树

    算法训练营 day20 二叉树 最大二叉树 合并二叉树 二叉搜索树中的搜索 验证二叉树 最大二叉树 654. 最大二叉树 - 力扣(LeetCode) 给定一个不重复的整数数组 nums . 最大二叉 ...

最新文章

  1. 60、IPv6配置实验之RIP
  2. svn 主干和分支项目代码更新与同步
  3. JQuery开发之Galleriffic图片插件介绍
  4. CSDN创始人蒋涛:开源吞噬世界,得开发者得天下
  5. Nginx的rewrite案例之防盗链
  6. Chomp!博弈(巧克力游戏)
  7. crawler4j mysql_Nutch、heritrix、crawler4j优缺点
  8. 牛顿如果穿越到现在,能看懂相对论和量子力学吗?
  9. 大数据学习(5)-- NoSQL数据库
  10. 调python返回图片_三个好习惯,帮你写好Python里的异常处理
  11. ssh2的application.xml配置文件配置详解
  12. Qt与MySQL通信错误及解决方法
  13. 驱动过滤透明加密微过滤驱动回顾
  14. php 监听端口数据客户端ip_PHP获取客户端和服务器端IP
  15. 基于排序变换混沌置乱算法的图像加密系统
  16. python可视化——matplotlib画图颜色控制
  17. 报表工具的 SQL 植入sql注入风险及规避方法
  18. GNU Make 使用手册!
  19. 计算机硬件的五大单元以及CPU的种类
  20. matplotlib给某一个点添加注释

热门文章

  1. onBind,onRebind,onUnbind
  2. 排班修改请假重算sql性能优化
  3. Java面向字符的 输入流
  4. 赛门铁克VCS(Veritas Cluster Server)双机日常管理
  5. sd 卡驱动在2.6内核的编写.sd/mmc/sdio kernel,sd/mmc/sdio 内核
  6. Mac 键盘与鼠标的映射
  7. echarts插件——全国疫情图
  8. canvas画图并下载图片
  9. java软件自学_Java编程自学软件下载
  10. 解决win10休眠后无法唤醒黑屏的问题