清华大学算法训练营 —— 象棋
描述
你有足够多的象棋“车”,在一个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. 切碎知识点 ...
- 算法训练营 重编码_编码训练营后如何找到工作
算法训练营 重编码 by Roxy Ayaz 由Roxy Ayaz 编码训练营后如何找到工作 (How to get a job after a coding bootcamp) Getting a ...
- 算法训练营 重编码_您在编码训练营期间可能面临的最大挑战
算法训练营 重编码 by Joanna Gaudyn 乔安娜·高登(Joanna Gaudyn) 您在编码训练营期间可能面临的最大挑战 (The biggest struggles you might ...
- 算法训练营 重编码_编码训练营适合您吗?
算法训练营 重编码 by Joanna Gaudyn 乔安娜·高登(Joanna Gaudyn) 编码训练营适合您吗? (Is a Coding Bootcamp something for you? ...
- 算法训练营 重编码_编码训练营之后该做什么-以及如何获得成功
算法训练营 重编码 by Anthony Morris 安东尼·莫里斯(Anthony Morris) 编码训练营之后该做什么-以及如何获得成功 (What to do - and how to fi ...
- 算法训练营 重编码_参加编码训练营之前要考虑的7件事
算法训练营 重编码 Coding bootcamps are becoming more and more popular, and for good reason. Just picture you ...
- 算法训练营 重编码_关于如何在没有训练营的情况下学习编码的10条提示
算法训练营 重编码 Seattle 2017. I had just attended my first team meeting at my first job as a software deve ...
- 算法训练营 重编码_编码训练营后十四天如何找到工作
算法训练营 重编码 Fourteen days after I graduated from my coding bootcamp, I had a job offer. Two weeks afte ...
- 算法训练营 day20 二叉树 最大二叉树 合并二叉树 二叉搜索树中的搜索 验证二叉树
算法训练营 day20 二叉树 最大二叉树 合并二叉树 二叉搜索树中的搜索 验证二叉树 最大二叉树 654. 最大二叉树 - 力扣(LeetCode) 给定一个不重复的整数数组 nums . 最大二叉 ...
最新文章
- 60、IPv6配置实验之RIP
- svn 主干和分支项目代码更新与同步
- JQuery开发之Galleriffic图片插件介绍
- CSDN创始人蒋涛:开源吞噬世界,得开发者得天下
- Nginx的rewrite案例之防盗链
- Chomp!博弈(巧克力游戏)
- crawler4j mysql_Nutch、heritrix、crawler4j优缺点
- 牛顿如果穿越到现在,能看懂相对论和量子力学吗?
- 大数据学习(5)-- NoSQL数据库
- 调python返回图片_三个好习惯,帮你写好Python里的异常处理
- ssh2的application.xml配置文件配置详解
- Qt与MySQL通信错误及解决方法
- 驱动过滤透明加密微过滤驱动回顾
- php 监听端口数据客户端ip_PHP获取客户端和服务器端IP
- 基于排序变换混沌置乱算法的图像加密系统
- python可视化——matplotlib画图颜色控制
- 报表工具的 SQL 植入sql注入风险及规避方法
- GNU Make 使用手册!
- 计算机硬件的五大单元以及CPU的种类
- matplotlib给某一个点添加注释