【BZOJ4375】Selling Tickets 随机化
【BZOJ4375】Selling Tickets
Description
厨师在一次晚宴上准备了n道丰盛的菜肴,来自世界各地的m位顾客想要购买宴会的门票。每一位顾客都有两道特别喜爱的菜,而只要吃到了至少一道他喜爱的菜,这位顾客就会感到很高兴。当然,每道菜最多只能供应给一位顾客。厨师想要卖出尽可能多的门票,但同时要能够保证,无论哪些顾客购买门票,所有到来的顾客都能感到高兴。现在,厨师想要问你,他最多能够卖多少门票?
Input
输入的第一行包含一个正整数T,表示数据组数。
对于每组数据,第一行包含一对整数n和m,分别表示菜肴的数量与顾客的数量。接下来m行,第i行的两个正整数Ai, Bi代表第i位顾客喜爱的两道菜的编号。相邻的两组数据之间用一个空行分隔。
Output
输出总共T行,对于每组数据,输出一个整数,表示厨师最多能售出的门票数。
Sample Input
6 4
1 2
1 2
3 4
5 6
6 5
1 2
1 2
1 2
3 4
5 6
4 5
1 2
1 3
1 4
2 3
3 4
Sample Output
2
4
HINT
对于第二组数据,厨师不能卖3张门票。因为如果顾客1, 2, 3购买门票,厨师是不可能用菜肴1, 2满足三个顾客的要求的。
【数据规模与约定】
1≤T≤15, 2≤n≤200, 0≤m≤500
1≤Ai, Bi≤n且Ai≠Bi
题解:我想不出正解,居然采用随机化;并且随机化写挂了,还针对数据进行随机化,我真是太无耻了~
简单的想法就是每次random_shuffle一个序列,沿着这个序列从左到右一直卖,如果卖到第i+1个卖不出去了,就用i更新答案。如何判定能不能卖出去呢?二分图最大匹配即可。
但是这种随机化策略实在是naive,我们考虑优化,如果卖到i+1个卖不出去了,我们看一下第i+1个人在二分图最大匹配上一共试图匹配了多少个人,即交错环的大小。并用交错环的大小来更新答案,然后就切了~
#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;
int n,m,S,T,ans,cnt,now,sum;
int A[510],B[510],vis[510],head[1010],p[1010],to[10010],next[10010],from[210];
void add(int a,int b)
{
to[cnt]=b,next[cnt]=head[a],head[a]=cnt++;
}
inline int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-')f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret*f;
}
int dfs(int x)
{
sum++;
for(int i=head[x];i!=-1;i=next[i])
{
if(vis[to[i]]!=now)
{
vis[to[i]]=now;
if(!from[to[i]]||dfs(from[to[i]]))
{
from[to[i]]=x;
return 1;
}
}
}
return 0;
}
void work()
{
srand(1011);
n=rd(),m=rd(),ans=m;
int i,j,a,b;
memset(head,-1,sizeof(head)),cnt=0,memset(vis,0,sizeof(vis)),now=0;
for(i=1;i<=m;i++) a=rd(),b=rd(),add(i,a),add(i,b),p[i]=i;
for(i=1;i<=2000;i++)
{
random_shuffle(p+1,p+m+1);
memset(from,0,sizeof(from));
for(j=1;j<=m;j++)
{
now++,sum=0;
if(!dfs(p[j]))
{
ans=min(ans,sum-1);
break;
}
}
}
printf("%d\n",ans);
}
int main()
{
int T=rd();
while(T--) work();
return 0;
}//3 6 4 1 2 1 2 3 4 5 6 6 5 1 2 1 2 1 2 3 4 5 6 4 5 1 2 1 3 1 4 2 3 3 4
【BZOJ4375】Selling Tickets 随机化的更多相关文章
- Python标准库08 多线程与同步 (threading包)
Python主要通过标准库中的threading包来实现多线程.在当今网络时代,每个服务器都会接收到大量的请求.服务器可以利用多线程的方式来处理这些请求,以提高对网络端口的读写效率.Python是一种 ...
- Python 学习入门(22)—— 线程同步
Python主要通过标准库中的threading包来实现多线程.在当今网络时代,每个服务器都会接收到大量的请求.服务器可以利用多线程的方式来处理这些请求,以提高对网络端口的读写效率.Python是一种 ...
- Travel notes in Vietnam
I‘m back:) For preparing IELTS exam, I haven't written article for over 70 days. It's a good exper ...
- 孙鑫视频VC++深入详解学习笔记
孙鑫视频VC++深入详解学习笔记 VC++深入详解学习笔记 Lesson1: Windows程序运行原理及程序编写流程 Lesson2: 掌握C++基本语法 Lesson3: MFC框架程序剖析 Le ...
- python快速教程-vamei
2016年10月26日 12:00:53 今天开始着手python的学习,希望能高效快速的学完! Python基础(上)... 7 实验简介... 7 一.实验说明... 8 1. 环境登录... 8 ...
- python部分内容存档
笨办法学python. 1 Ec6字符串和文本... 1 ec7. 1 ec8. 1 Ec9. 1 Ec10 转义字符... 1 Ec11提问... 1 raw_input和input的区别... 1 ...
- CodeForces - 896D :Nephren Runs a Cinema(卡特兰数&组合数学---比较综合的一道题)
Lakhesh loves to make movies, so Nephren helps her run a cinema. We may call it No. 68 Cinema. Howev ...
- CodeForces - 150C :Smart Cheater (线段树,求最大连续区间)
I guess there's not much point in reminding you that Nvodsk winters aren't exactly hot. That increas ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
随机推荐
- 码云的GIT操作
git操作 git initgit add .git commit -m ""git remote add origin https://git.coding.net/jessei ...
- 关于Docker&kubernetes的一些问题
本文是我自己在学习docker以及kubernetes的过程中遇到的一些问题,以及同事在听过培训之后一些问题,事后我自己去网上找些资料以及问一些资深大牛,我在此做一个归纳总结,将这些问题的解答做一个分 ...
- 10g full join 优化
今天一个女生咨询我报名学优化.聊着聊着就让我优化一个sql 由于怕泄密,所以删除了 sql . 不好意思 该sql是 olap 的, 在oracle10g 上面跑.跑一次要33秒钟.一般olap报表. ...
- webstrom 很卡 底下一直走进度条 scanning files to index
最近工作总会遇到一些问题 先说说webstrom 其中有一次仅仅开了两个项目 电脑风扇就各种轰鸣 各种重启 安装卸载webstrom 都没有作用 好吧 其实解决很简单 选择一个文件夹,右键, Mark ...
- hbuilder - wap to app
官方文档: http://www.dcloud.io/wap2app.html 新建Wap2App,示例网址:www.baidu.com 随后,我们可以在 最后,我们可以 打包完成以后,下载即可
- Python——五分钟理解元类(metaclasses)
“元类的魔幻变化比 99% 的用户所担心的更多,当你搞不懂是否真的需要用它的时候,就是不需要.” —Tim Peters 本文源于在 PyCon UK 2008 上的一个快速演讲. 元类被称为 Pyt ...
- 【Linux】Linux删除指定文件夹下面 名称不包含指定字符的文件
例如:现在文件夹home下面有以下数据文件列表 A_20171215.DAT B_20160630.DAT C_20170823.DAT 现在想删除不包含"20160630"这个字 ...
- discuz !NT 3.5 论坛整合 .net 网站用户登录,退出
using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.HtmlCont ...
- Ubuntu 12.04 的IP 设置
通过访问 /etc/network/interfaces 实现动态IP 或者静态IP 的设置. vim /et/network/interfaces 1.设置动态IP auto lo iface ...
- Delphi里J+开关作用类似C语言的static变量
從前筆者曾經對以下的程式產生過疑惑:{$J+}procedure TForm1.Button1Click(Sender: TObject);const VarConst: integer = 4;b ...