题意:给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. 部门树形结构,使用Treeview控件显示部门

    部门树形结构.设计张部门表用于存储部门编码.名称.上级部门id,使用Treeview控件显示部门树,并实现部门增删改.移动.折叠等功能.特别提示,部门有层级关系,可用donetbar的adtree控件 ...

  2. [转载]Badboy使用教程

    Badboy-系列教程-资料整理: Badboy自动化测试工具1 界面介绍 http://leafwf.blog.51cto.com/872759/1107079 Badboy自动化测试工具2 录制 ...

  3. Runner站立会议之个人会议(冲刺二)

    2016.5.23 今天开会确定了接下来的目标,完成收集相关数据任务 明天要寻找类型对应的按钮图标 遇到的问题:数据中男女生,有无恋爱,区域限制均可能导致计划部分有出入 2016.5.24 今天查询相 ...

  4. Valid Palindrome [LeetCode]

    Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignori ...

  5. 转 SQL Union和SQL Union All两者用法区别效率以及与order by 和 group by配合问题

    SQL Union和SQL Union All两者用法区别效率以及与order by 和 group by配合问题 SQL Union和SQL Union All用法 SQL UNION 操作符 UN ...

  6. SQL语句创建数据库,SQL语句删除数据库,SQL语句创建表,SQL语句删除表,SQL语句添加约束,SQL语句删除约束

    创建数据库: CREATE DATABASE Test --要创建的数据库名称 ON PRIMARY ( --数据库文件的具体描述 NAME='Test_data', --主数据文件的逻辑名称 FIL ...

  7. Python中T-SNE实现降维

    Python中T-SNE实现降维 from sklearn.manifold import TSNE from sklearn.datasets import load_iris from sklea ...

  8. Json文件放入Assets文件,读取解析并且放入listview中显示。

    package com.lixu.TestJson; import android.app.Activity; import android.content.Context; import andro ...

  9. Android——关于Activity跳转的返回(无返回值和有返回值)——有返回值

    说明: 跳转页面,并将第一页的Edittext输入的数据通过按钮Button传到第二页用Edittext显示,点击第二页的 返回按钮Button返回第一页(改变第二页的Edittext的内容会传至第一 ...

  10. Oracle中any和all的区别用法

    对于any,all的用法,书中说的比较绕口,难以理解,如果通过举例就会比较清晰. any的例子: select * from t_hq_ryxx where gongz > any (selec ...