【BZOJ4375】Selling Tickets

Description

厨师在一次晚宴上准备了n道丰盛的菜肴,来自世界各地的m位顾客想要购买宴会的门票。每一位顾客都有两道特别喜爱的菜,而只要吃到了至少一道他喜爱的菜,这位顾客就会感到很高兴。当然,每道菜最多只能供应给一位顾客。厨师想要卖出尽可能多的门票,但同时要能够保证,无论哪些顾客购买门票,所有到来的顾客都能感到高兴。现在,厨师想要问你,他最多能够卖多少门票?

Input

输入的第一行包含一个正整数T,表示数据组数。
对于每组数据,第一行包含一对整数n和m,分别表示菜肴的数量与顾客的数量。接下来m行,第i行的两个正整数Ai, Bi代表第i位顾客喜爱的两道菜的编号。相邻的两组数据之间用一个空行分隔。

Output

输出总共T行,对于每组数据,输出一个整数,表示厨师最多能售出的门票数。

Sample Input

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

Sample Output

4
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 随机化的更多相关文章

  1. Python标准库08 多线程与同步 (threading包)

    Python主要通过标准库中的threading包来实现多线程.在当今网络时代,每个服务器都会接收到大量的请求.服务器可以利用多线程的方式来处理这些请求,以提高对网络端口的读写效率.Python是一种 ...

  2. Python 学习入门(22)—— 线程同步

    Python主要通过标准库中的threading包来实现多线程.在当今网络时代,每个服务器都会接收到大量的请求.服务器可以利用多线程的方式来处理这些请求,以提高对网络端口的读写效率.Python是一种 ...

  3. 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 ...

  4. 孙鑫视频VC++深入详解学习笔记

    孙鑫视频VC++深入详解学习笔记 VC++深入详解学习笔记 Lesson1: Windows程序运行原理及程序编写流程 Lesson2: 掌握C++基本语法 Lesson3: MFC框架程序剖析 Le ...

  5. python快速教程-vamei

    2016年10月26日 12:00:53 今天开始着手python的学习,希望能高效快速的学完! Python基础(上)... 7 实验简介... 7 一.实验说明... 8 1. 环境登录... 8 ...

  6. python部分内容存档

    笨办法学python. 1 Ec6字符串和文本... 1 ec7. 1 ec8. 1 Ec9. 1 Ec10 转义字符... 1 Ec11提问... 1 raw_input和input的区别... 1 ...

  7. 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 ...

  8. CodeForces - 150C :Smart Cheater (线段树,求最大连续区间)

    I guess there's not much point in reminding you that Nvodsk winters aren't exactly hot. That increas ...

  9. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

随机推荐

  1. [转载]Linux 卸载JDK并安装新版本JDK (rpm,tar)

    FROM:http://josh-persistence.iteye.com/blog/1908549 一.查看Jdk的安装路径: whereis javawhich java (java执行路径)e ...

  2. zookeeper安装和使用

    Zookeeper是Hadoop的一个子项目,它是分布式系统中的协调系统,可提供的服务主要有:配置服务.名字服务.分布式同步.组服务等. 1.下载地址 https://mirrors.cnnic.cn ...

  3. Elasticsearch教程(八) elasticsearch delete 删除数据(Java)

    Elasticsearch的删除也是很灵活的,下次我再介绍,DeleteByQuery的方式.今天就先介绍一个根据ID删除.上代码. package com.sojson.core.elasticse ...

  4. 自己动手写android图片异步载入库

    尊重他人劳动成果,转载请说明出处:http://blog.csdn.net/bingospunky/article/details/44344085 接触android有半年了.关于图片异步载入.一直 ...

  5. Transportation poj1040

    Ruratania is just entering capitalism and is establishing new enterprising activities in many fields ...

  6. vue笔记二

    七.列表渲染 1.示例 <ul id="example-2"> <li v-for="(item, index) in items"> ...

  7. python——定时闹钟讲解

    自己写的闹钟, 只可以播放wav格式的音频. import time import sys soundFile = 'sound.wav' not_executed = 1 def soundStar ...

  8. JavaScript Array splice函数

    // 原来的数组 var array = ["one", "two", "four"]; // splice(position, numbe ...

  9. 键盘上所有键位的ascii值

    上次用的时候一直找,这次找到了,收藏起来. 0x1 鼠标左键 0x2 鼠标右键 0x3 CANCEL 键 0x4 鼠标中键 0x8 BACKSPACE 键 0x9 TAB 键 0xC CLEAR 键 ...

  10. 杂(三)-The type java.lang.Object cannot be resolved It is indirectly referenced ...

    The type java.lang.Object cannot be resolved. It is indirectly referenced from required .class files ...