HDU5090--Game with Pearls 二分图匹配 (匈牙利算法)
题意:给N个容器,每个容器里有一定数目的珍珠,现在Jerry开始在管子上面再放一些珍珠,放上的珍珠数必须是K的倍数,可以不放。最后将容器排序,如果可以做到第i个容器上面有i个珍珠,则Jerry胜出,反之Tom胜出。
思路:数据比较小,所以我是水过的,模拟过程 + 贪心就能过。但正解是二分图匹配,之前没接触过。
二分图匹配:解释一下第二组样例,k = 2;

从左向右,每一个能够匹配 i 的(a),就去掉 i 周围其他的边,然后再也去掉a能指向的边,计算一下共有几个能匹配的,如果是n,则Jerry胜,否则Tom胜;
水过的代码
///水过的代码
#include <iostream>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <string>
#include <sstream>
#include <algorithm>
#define Max 2147483647
#define INF 0x7fffffff
#define N 90010
#define ll long long
#define mem(a,b) memset(a,b,sizeof(a))
#define repu(i, a, b) for(int i = (a); i < (b); i++)
const double PI=-acos(-1.0);
using namespace std;
int a[N];
int main()
{
int n,T,k;
cin>>T;
while(T--)
{
cin>>n>>k;
repu(i,,+n)
cin>>a[i];
sort(a+,a++n);
int ok = -,i=;
while(i<=n)
{
if(a[i]>i)
{
ok = ;
break;
}
else if(a[i]<i)
{
a[i]+=k;
sort(a+,a++n);
continue;
}
else
i++;
}
if(ok==)
cout<<"Tom\n";
else
cout<<"Jerry\n";
}
return ;
}
带权值的二分图匹配(改编下列某大神的代码):
///http://acm.hust.edu.cn/vjudge/contest/view.action?cid=82360#problem/B
#include <iostream>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <string>
#include <sstream>
#include <algorithm>
#define Max 2147483647
#define INF 0x7fffffff
#define N 901
#define ll long long
#define mem(a,b) memset(a,b,sizeof(a))
#define repu(i, a, b) for(int i = (a); i < (b); i++)
using namespace std;
int g[N][N],vis[N],march[N],mat[N];
int n;
struct S
{
int val,v;
bool operator < (const S& s ) const
{
return val > s.val;
}
} p[N];
int dfs( int u )
{
for( int v = ; v <= n ; v++ ) ///考虑所有 Yi 顶点 v
{
if(g[u][v]&&!vis[v]) ///v 与 u 邻接,且没有访问过
{
vis[v] = ;///如果 v 没有匹配,或者 v 已经匹配了,但从 march[v]出发可以找到一条增广路
if(march[v] == - || dfs(march[v])) ///注意如果前一个条件成立,则不会递归调用
{
march[v] = u; ///把 v 匹配给 u
return ; ///找到可增广路
}
}
}
mat[u] = ;///如果不存在从u出发的增广路
return ;
} void MaxMatch( ) ///求二部图最大匹配的匈牙利算法
{
int res = ; ///所求得的最大匹配
for(int i = ; i <= n ; i++)
{
memset(vis , , sizeof(vis)) ;
int u = p[i].v;///按照排好的权值一个个寻找匹配点
res += dfs(u);
}
///res是能够匹配的个数
repu(i,,n+)
{
int t = march[i];///在dfs中是把v匹配给u,因此需要进一步转化
mat[t] = i;
}
for(int i = ; i < +n; i++)
if(i==)
printf("%d", mat[i]);
else
printf(" %d", mat[i]);
}
int main()
{
int a,b,m;
scanf("%d",&n);
memset(g,,sizeof(g));
memset(march,-,sizeof(march));
memset(mat,,sizeof(mat));
repu(i,,+n)
{
scanf("%d",&a);
p[i].val = a;
p[i].v = i;
}
sort(p+,p++n);///按照权值排序
repu(i,,+n)
{
scanf("%d",&m);
repu(j,,m)
{
scanf("%d",&b);
g[i][b] = ;
}
}
MaxMatch();
return ;
}
二分图匹配的代码(某个大神的代码,先留着):
POJ1469是一个裸的二分图匹配,有p个课程,n个学生,求是否能让每个课程都有学生。
///转自:http://blog.csdn.net/hackbuteer1/article/details/7398008
/*==================================================*\
| 二分图匹配(匈牙利算法DFS 实现)
| INIT: g[][]邻接矩阵;
| 优点:实现简洁容易理解,适用于稠密图,DFS找增广路快。
| 找一条增广路的复杂度为O(E),最多找V条增广路,故时间复杂度为O(VE)
==================================================*/
#include<stdio.h>
#include<memory.h>
bool g[][]; ///邻接矩阵,true代表有边相连
bool flag,visit[]; ///记录V2中的某个点是否被搜索过
int match[]; ///记录与V2中的点匹配的点的编号
int p,n; ///二分图中左边、右边集合中顶点的数目 /// 匈牙利算法
bool dfs(int u)
{
for (int i = ; i <= n; ++i)
{
if (g[u][i] && !visit[i]) ///如果节点i与u相邻并且未被查找过
{
visit[i] = true; ///标记i为已查找过
if (match[i] == - || dfs(match[i])) ///如果i未在前一个匹配M中,或者i在匹配M中,但是从与i相邻的节点出发可以有增广路径
{
match[i] = u; ///记录查找成功记录,更新匹配M(即“取反”)
return true; ///返回查找成功
}
}
}
return false;
} int main(void)
{
int i,j,k,t,v,ans;
scanf("%d",&t);
while (t--)
{
scanf("%d %d", &p, &n);
for (i = ; i <= p; i++)
{
for (j = ; j <= n; j++)
g[i][j] = false;
}
for (i = ; i <= n; i++)
match[i] = -;
flag = true;
for (i = ; i <= p; i++)
{
scanf("%d",&k);
if (k == )
flag = false;
while (k--)
{
scanf("%d",&v);
g[i][v] = true;
}
}
if (flag)
{
ans = ;
for (i = ; i <= p; i++)
{
memset(visit,false,sizeof(visit)); ///清空上次搜索时的标记
if(dfs(i)) ///从节点i尝试扩展
ans++;
}
if (ans == p)
puts("YES");
else
puts("NO");
}
else
puts("NO");
}
return ;
}
博客讲得很好,很受益
HDU5090--Game with Pearls 二分图匹配 (匈牙利算法)的更多相关文章
- HDU 5943 Kingdom of Obsession 【二分图匹配 匈牙利算法】 (2016年中国大学生程序设计竞赛(杭州))
		Kingdom of Obsession Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Oth ... 
- USACO 4.2 The Perfect Stall(二分图匹配匈牙利算法)
		The Perfect StallHal Burch Farmer John completed his new barn just last week, complete with all the ... 
- Codevs 1222 信与信封问题  二分图匹配,匈牙利算法
		题目: http://codevs.cn/problem/1222/ 1222 信与信封问题 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 ... 
- (转)二分图匹配匈牙利算法与KM算法
		匈牙利算法转自于: https://blog.csdn.net/dark_scope/article/details/8880547 匈牙利算法是由匈牙利数学家Edmonds于1965年提出,因而得名 ... 
- BZOJ1059 [ZJOI2007]矩阵游戏  二分图匹配  匈牙利算法
		欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1059 题意概括 有一个n*n(n<=200)的01矩阵,问你是否可以通过交换整行和整列使得左 ... 
- 网络流24题 第三题 - CodeVS1904 洛谷2764 最小路径覆盖问题  有向无环图最小路径覆盖  最大流  二分图匹配  匈牙利算法
		欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - CodeVS1904 题目传送门 - 洛谷2764 题意概括 给出一个有向无环图,现在请你求一些路径,这些路径 ... 
- 矩阵游戏|ZJOI2007|BZOJ1059|codevs1433|luoguP1129|二分图匹配|匈牙利算法|Elena
		1059: [ZJOI2007]矩阵游戏 Time Limit: 10 Sec Memory Limit: 162 MB Description 小Q是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩 ... 
- BZOJ 1191 [HNOI2006]超级英雄Hero:二分图匹配 匈牙利算法
		题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1191 题意: 有m道题,每答对一题才能接着回答下一个问题. 你一道题都不会,但是你有n个“ ... 
- [bzoj]1059矩阵游戏<二分图匹配*匈牙利算法>
		题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1059 初见此题,我觉得这是水题,我认为只要每一行和每一列至少存在一个黑格就可以出现对角线, ... 
- HDU1507 Uncle Tom's Inherited Land* 二分图匹配 匈牙利算法 黑白染色
		原文链接http://www.cnblogs.com/zhouzhendong/p/8254062.html 题目传送门 - HDU1507 题意概括 有一个n*m的棋盘,有些点是废的. 现在让你用1 ... 
随机推荐
- NetworkShareAccesser: 远程PC1 文件 copy 到PC2 文件夹
			Usage: string strRepoBundlePath = @"\\at1-repo01\ATE\Bundles\SharePoint\Open\denyopen.zip" ... 
- hdu---1024Max Sum Plus Plus(动态规划)
			Max Sum Plus Plus Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ... 
- App crash 报错 'NSUnknownKeyException'
			报错: *** Terminating app due to uncaught exception , reason: '[<NSObject 0x6e36ae0> setValue:fo ... 
- Struts、JSTL标签库的基本使用方法
			一 使用Struts标签之前需要经过下面3个步骤的配置. 1.导入TLD文件. 2.在web.xml中注册标签库. 3.在页面中引入标签库. 下面详细介绍以上步骤. 1 导入TLD文件. TLD文件是 ... 
- java邮件
			我们用过很多邮件,qq,163,网易等. 一.发送邮件需要遵循smtp协议,接收邮件需要遵循pop3协议 二.发邮件的过程 假设用qq邮件 写邮件-->点 “发送” --> qq邮件服务器 ... 
- [转]C#取得内网IP、外网IP、客户端IP方法
			前言 在 Windows Form Application 里对于取得 IP Address 有内网.外网两种 IP Address ,如果只需要取得内网 IP Address ,可以透过使用 IPH ... 
- 智能手机Web开发笔记
			智能手机版(简称M版)前端开发终于告一段落,第一次做移动端开发,没有想象中那么难搞,但是期间也遇到了各种这样那样的问题,虽然从小日记都不是自己写的,但是开发笔记还是要自己写的,不敢说让别人学习,只是仅 ... 
- VS2003编译后的网站如何修改代码
			VS2003编译后的网站,如果没有源代码,而要修改里面的代码时,可以以以下方式解决: 反编译dll,把找出cs代码文件,然后重新建一个类项目,把此文件中的代码修改后重新生成dll,放在编译的网站中的b ... 
- C#获取本机mac地址
			添加System.Management的引用, using System.Management; string mac = ""; ManagementClass mc = new ... 
- Mongoose 是什么?
			Mongoose 参考手册 标签(空格分隔): MongoDB 一般我们不直接用MongoDB的函数来操作MongoDB数据库 Mongose就是一套操作MongoDB数据库的接口. Schema 一 ... 
