HDU 1281 TOJ 2733 棋盘游戏 二分图最大匹配

2024-03-29 13:18

本文主要是介绍HDU 1281 TOJ 2733 棋盘游戏 二分图最大匹配,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

棋盘游戏

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 2535    Accepted Submission(s): 1476


Problem Description
小希和Gardon在玩一个游戏:对一个N*M的棋盘,在格子里放尽量多的一些国际象棋里面的“车”,并且使得他们不能互相攻击,这当然很简单,但是Gardon限制了只有某些格子才可以放,小希还是很轻松的解决了这个问题(见下图)注意不能放车的地方不影响车的互相攻击。 
所以现在Gardon想让小希来解决一个更难的问题,在保证尽量多的“车”的前提下,棋盘里有些格子是可以避开的,也就是说,不在这些格子上放车,也可以保证尽量多的“车”被放下。但是某些格子若不放子,就无法保证放尽量多的“车”,这样的格子被称做重要点。Gardon想让小希算出有多少个这样的重要点,你能解决这个问题么?

Input
输入包含多组数据, 
第一行有三个数N、M、K(1<N,M<=100 1<K<=N*M),表示了棋盘的高、宽,以及可以放“车”的格子数目。接下来的K行描述了所有格子的信息:每行两个数X和Y,表示了这个格子在棋盘中的位置。

Output
对输入的每组数据,按照如下格式输出: 
Board T have C important blanks for L chessmen.

Sample Input
 
3 3 4 1 2 1 3 2 1 2 2 3 3 4 1 2 1 3 2 1 3 2

Sample Output
 
Board 1 have 0 important blanks for 2 chessmen. 
Board 2 have 3 important blanks for 3 chessmen.

把棋盘的行x看成二分图左边的点,列y看成二分图右边的点, 
那么就把可以放车的位置看成是一条边, 
而二分图的最大匹配中x互不相同,y互不相同。

以下普通的匈牙利算法在HDU过了。

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<iostream>
#include<string>
#include<algorithm>
#include<map>
#include<queue>
#include<vector>
using namespace std;
int n,n2,ma[205][205],vis[205],dx[205];
int find(int i)
{for(int j=1;j<=n2;j++){if(vis[j]==0&&ma[i][j]){vis[j]=1;if(dx[j]==-1||find(dx[j])){dx[j]=i;return 1;}}}return 0;
}
int main()
{	int m,i,j,a[10005],b[10005],o=1;while(scanf("%d%d%d",&n,&n2,&m)!=EOF){memset(ma,0,sizeof ma);memset(dx,-1,sizeof dx);for(i=0;i<m;i++){scanf("%d%d",&a[i],&b[i]);ma[a[i]][b[i]]=1;}int s=0,ans=0;for(i=1;i<=n;i++){memset(vis,0,sizeof vis);s+=find(i);}for(i=0;i<m;i++){memset(dx,-1,sizeof dx);ma[a[i]][b[i]]=0;int ss=0;for(j=1;j<=n;j++){memset(vis,0,sizeof vis);ss+=find(j);}if(ss<s)ans++;ma[a[i]][b[i]]=1;}printf("Board %d have %d important blanks for %d chessmen.\n",o++,ans,s);}	
}

但是在TOJ超时... 于是只能优化一下,多一个pre数组。

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<iostream>
#include<string>
#include<algorithm>
#include<map>
#include<queue>
#include<vector>
using namespace std;
int n,n2,ma[205][205],vis[205],dx[205],pre[205];
int find(int i,int p[205])
{for(int j=1;j<=n2;j++){if(vis[j]==0&&ma[i][j]){vis[j]=1;if(p[j]==-1||find(p[j],p)){p[j]=i;return 1;}}}return 0;
}
int main()
{	int m,i,j,a,b,o=1;while(scanf("%d%d%d",&n,&n2,&m)!=EOF){memset(ma,0,sizeof ma);memset(dx,-1,sizeof dx);for(i=0;i<m;i++){scanf("%d%d",&a,&b);ma[a][b]=1;}int s=0,ans=0;for(i=1;i<=n;i++){memset(vis,0,sizeof vis);s+=find(i,dx);}for(i=1;i<=n2;i++){if(dx[i]==-1)continue;//省时间			ma[dx[i]][i]=0;int ss=0;memset(pre,-1,sizeof(pre));for(j=1;j<=n;j++){memset(vis,0,sizeof vis);ss+=find(j,pre);}if(ss<s)ans++;ma[dx[i]][i]=1;}printf("Board %d have %d important blanks for %d chessmen.\n",o++,ans,s);}	
}

这篇关于HDU 1281 TOJ 2733 棋盘游戏 二分图最大匹配的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/858693

相关文章

高仿精仿愤怒的小鸟android版游戏源码

这是一款很完美的高仿精仿愤怒的小鸟android版游戏源码,大家可以研究一下吧、 为了报复偷走鸟蛋的肥猪们,鸟儿以自己的身体为武器,仿佛炮弹一样去攻击肥猪们的堡垒。游戏是十分卡通的2D画面,看着愤怒的红色小鸟,奋不顾身的往绿色的肥猪的堡垒砸去,那种奇妙的感觉还真是令人感到很欢乐。而游戏的配乐同样充满了欢乐的感觉,轻松的节奏,欢快的风格。 源码下载

剑指offer(C++)--孩子们的游戏(圆圈中最后剩下的数)

题目 每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0...m-1报数....这样下去

【服务器08】之【游戏框架】之【加载主角】

首先简单了解一下帧率 FixedUpdate( )   >   Update( )   >   LateUpdate( ) 首先FixedUpdate的设置值 默认一秒运行50次 虽然默认是0.02秒,但FiexedUpdate并不是真的0.02秒调用一次,因为在脚本的生命周期内,FixedUpdate有一个小循环,这个循环也是通过物理时间累计看是不是大于0.02了,然后调用一次。有

编译测试后出现“发现不明确的匹配”错误

原文链接:http://blog.163.com/zhaoyanping_1125/blog/static/201329153201204218533/ 错误提示: 【“/”应用程序中的服务器错误。  分析器错误 说明: 在分析向此请求提供服务所需资源时出错。请检查下列特定分析错误详细信息并适当地修改源文件。  分析器错误信息: 发现不明确的匹配。】   这个问题发生原因一般情况是

linux匹配Nginx日志,某个字符开头和结尾的字符串

匹配 os=1 开头, &ip结尾的字符串 cat 2018-06-07.log | egrep -o ‘os=1.*.&ip’ 存入日志。然后使用submit 前面和后面的值去掉,剩下就是需要的字符串。 cat 2018-06-07.log | egrep -o ‘os=1.*.&ip’ >log.log

2024年6月24日-6月30日(ue独立游戏为核心)

试过重点放在独立游戏上,有个indienova独立游戏团队是全职的,由于他们干了几个月,节奏暂时跟不上,紧张焦虑了。五一时也有点自暴自弃了,实在没必要,按照自己的节奏走即可。精力和时间也有限,放在周末进行即可。除非哪天失业了,再也找不到工作了,再把重心放在独立游戏上。 另外,找到一个同样业余的美术,从头做肉鸽游戏,两周一次正式交流即可。节奏一定要放慢,不能影响正常工作生活。如果影响到了,还不如自

植物大战僵尸杂交版2.1版本终于来啦!游戏完全免费

在这个喧嚣的城市里,我找到了一片神奇的绿色世界——植物大战僵尸杂交版。它不仅是一款游戏,更像是一扇打开自然奥秘的窗户,让我重新认识了植物和自然的力量。 植物大战僵尸杂交版最新绿色版下载链接: https://pan.quark.cn/s/d60ed6e4791c 🌱 🔥 激情介绍:不只是游戏,更是生态课 植物大战僵尸杂交版将经典的策略塔防游戏带入了一个全新的维度。这里,每一种植物都拥

关于修改计算机的处理器数和最大内存数的问题

问题描述: 刚开始本来是想让计算机的运行速度运行的快点,于是在网上搜索如何让计算机的运行速度更快,找到了一种关于修改计算机内存数和计算机的处理核数可以让计算机运行的更快。 遇到问题: 当我通过命令msconfig →引导→高级选项→勾选了处理器数和最大内存数,然后重启,结构整个计算机都卡的要死,于是记录下来。网上的答案有时候真的是很不负责任,也有可能是自己技术不到位。 结果:取消处理器和内

上海邀请赛 A题目 HDU 5236(dp)

先求出没有ctrl+s的时候构造长度为i的期望f[i] 。然后枚举保存的次数,求出最小即可。 #include<cstdio>#include<cstdio>#include<cmath>#include<queue>#include<stack>#include<string>#include<cstring>#include<iostream>#include<map>

hdu 2586 树上点对最近距离 (lca)

,只要知道dis[i][j]=dis[i][root]+dis[j][root]-2*dis[Lca(i,j)][root].   其中root为树的根节点,LCA(i,j)为i,j的最近公共祖先。 所以我们先把所有的询问储存下来,然后离线直接查询。复杂度是o(n+q)的。 VIE #include<cstdio>#include<algorithm>#include<i