题意:给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 二分图匹配 (匈牙利算法)的更多相关文章

  1. HDU 5943 Kingdom of Obsession 【二分图匹配 匈牙利算法】 (2016年中国大学生程序设计竞赛(杭州))

    Kingdom of Obsession Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Oth ...

  2. USACO 4.2 The Perfect Stall(二分图匹配匈牙利算法)

    The Perfect StallHal Burch Farmer John completed his new barn just last week, complete with all the ...

  3. Codevs 1222 信与信封问题 二分图匹配,匈牙利算法

    题目: http://codevs.cn/problem/1222/ 1222 信与信封问题   时间限制: 1 s   空间限制: 128000 KB   题目等级 : 钻石 Diamond 题解 ...

  4. (转)二分图匹配匈牙利算法与KM算法

    匈牙利算法转自于: https://blog.csdn.net/dark_scope/article/details/8880547 匈牙利算法是由匈牙利数学家Edmonds于1965年提出,因而得名 ...

  5. BZOJ1059 [ZJOI2007]矩阵游戏 二分图匹配 匈牙利算法

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1059 题意概括 有一个n*n(n<=200)的01矩阵,问你是否可以通过交换整行和整列使得左 ...

  6. 网络流24题 第三题 - CodeVS1904 洛谷2764 最小路径覆盖问题 有向无环图最小路径覆盖 最大流 二分图匹配 匈牙利算法

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - CodeVS1904 题目传送门 - 洛谷2764 题意概括 给出一个有向无环图,现在请你求一些路径,这些路径 ...

  7. 矩阵游戏|ZJOI2007|BZOJ1059|codevs1433|luoguP1129|二分图匹配|匈牙利算法|Elena

    1059: [ZJOI2007]矩阵游戏 Time Limit: 10 Sec  Memory Limit: 162 MB Description 小Q是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩 ...

  8. BZOJ 1191 [HNOI2006]超级英雄Hero:二分图匹配 匈牙利算法

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1191 题意: 有m道题,每答对一题才能接着回答下一个问题. 你一道题都不会,但是你有n个“ ...

  9. [bzoj]1059矩阵游戏<二分图匹配*匈牙利算法>

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1059 初见此题,我觉得这是水题,我认为只要每一行和每一列至少存在一个黑格就可以出现对角线, ...

  10. HDU1507 Uncle Tom's Inherited Land* 二分图匹配 匈牙利算法 黑白染色

    原文链接http://www.cnblogs.com/zhouzhendong/p/8254062.html 题目传送门 - HDU1507 题意概括 有一个n*m的棋盘,有些点是废的. 现在让你用1 ...

随机推荐

  1. CentOS6安装python2.7

    第一次用centOS,感觉好高大上,安装了差不多一个半小时,学习了挺多命令的 1.  检查centOS中默认的python版本,一般是python2.6. 命令:python –v 2. 安装GCC ...

  2. Eclipse Maven Web Application 设置配置文件

    默认的项目添加会有问题,各种版本和编译版本错误造成. 1.更改Maven编译版本 2.更改项目Facets针对的版本 3.更改Settings

  3. hdu----(2586)How far away ?(DFS/LCA/RMQ)

    How far away ? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  4. 初学java之try-catch-finally语句的实例

    /* try - catch语句的例子,模拟向货船上装载集装箱 ,如果货船超重,那么货船认为这是一个异常,将拒绝装载集装箱, 但无论是否发生异常,货船都需要正点起航. */ package st; c ...

  5. 超实用的JavaScript代码段 Item4 --发送短信验证码

    发送短信验证码 实现点击“发送验证码”按钮后,按钮依次显示为“59秒后重试”.“58秒后重试”…直至倒计时至0秒时再恢复显示为“发送验证码”.在倒计时期间按钮为禁用状态 . 第一步.获取按钮.绑定事件 ...

  6. SAP采购申请审批记录增强

    业务需要,开发就搞.... EBAN中增强结构:CI_EBANDB ANAME 类型 UNAME 用户名 ADATE 类型 AEDAT DATS 更改日期 ATIME 类型 UZEIT TIMS 时间 ...

  7. [转载]WCF实现双工通信

    双工(Duplex)模式的消息交换方式体现在消息交换过程中,参与的双方均可以向对方发送消息.基于双工MEP消息交换可以看成是多个基本模式下(比如请求-回复模式和单项模式)消息交换的组合.双工MEP又具 ...

  8. HBase HMaster Architecture - HBase Master架构

    HBase architecture follows the traditional master slave model where you have a master which takes de ...

  9. --投资情况统计详情sql

    --投资情况统计详情sqlselect BidRecord.*, RegInfo.UserName,UserInfo.phone,BorrowInfo.Title,BorrowInfo.BorrowC ...

  10. (转载)Java基础知识总结

    写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java语言代码把思路体现出来. 学习新技 ...