[HNOI2006]超级英雄(二分+网络流)
[HNOI2006]超级英雄
题目描述
现在电视台有一种节目叫做超级英雄,大概的流程就是每位选手到台上回答主持人的几个问题,然后根据回答问题的多少获得不同数目的奖品或奖金。主持人问题准备了若干道题目,只有当选手正确回答一道题后,才能进入下一题,否则就被淘汰。为了增加节目的趣味性并适当降低难度,主持人总提供给选手几个“锦囊妙计”,比如求助现场观众,或者去掉若干个错误答案(选择题)等等。
这里,我们把规则稍微改变一下。假设主持人总共有m道题,选手有n种不同的“锦囊妙计”。主持人规定,每道题都可以从两种“锦囊妙计”中选择一种,而每种“锦囊妙计”只能用一次。我们又假设一道题使用了它允许的锦囊妙计后,就一定能正确回答,顺利进入下一题。现在我来到了节目现场,可是我实在是太笨了,以至于一道题也不会做,每道题只好借助使用“锦囊妙计”来通过。如果我事先就知道了每道题能够使用哪两种“锦囊妙计”,那么你能告诉我怎样选择才能通过最多的题数吗?
输入输出格式
输入格式:
输入的第一行是两个正整数 \(n\) 和 \(m\) ( \(0 < n < 1001, 0 < m < 1001\) )表示总共有 \(n\) 种“锦囊妙计”,编号为 \(0 \sim n-1\) ,总共有 \(m\) 个问题。
以下的 \(m\) 行,每行两个数,分别表示第 \(m\) 个问题可以使用的“锦囊妙计”的编号。
注意,每种编号的“锦囊妙计”只能使用一次,同一个问题的两个“锦囊妙计”可能一样。
输出格式:
输出的第一行为最多能通过的题数 \(p\) ,接下来 \(p\) 行,每行为一个整数,第 \(i\) 行表示第 \(i\) 题使用的“锦囊妙计的编号”。
如果有多种答案,那么任意输出一种,本题使用 Special Judge 评判答案。
输入输出样例
输入样例#1: 复制
5 6
3 2
2 0
0 3
0 4
3 2
3 2
输出样例#1: 复制
4
3
2
0
4
题解
第一眼看到题目。
这不是一个裸的二分图匹配吗?
虽然我不会打二分图。。。但是我还是会点网络流的。。
打一发交上去。
全WA????
再看题,原来没有这一次的通关下一次就无法在匹配了。也就是说我们要按顺序匹配过来,如果当前位无法通关,那就不能继续了。那么,这不是裸二分+二分图最大匹配吗?
打一发。又GG了。40分??
去bzoj上交,不要输出方案。A了??
回来检查,发现是输出方案打错了。。。
友善提醒:不要二分出来以后(二分途中没记录)直接输出方案。要一边二分一边记录啊啊啊啊。
代码
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
const int N=100001;
const int inf=99999999;
int n,m,s,t,ans;
int num=1,head[N],H[N],xx[N],yy[N],line[N],cnt;
int dep[N];
struct node{
int c,next,to;
}e[N<<1];
int read(){
int x=0,w=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return x*w;
}
void add(int from,int to,int c){
num++;
e[num].to=to;
e[num].c=c;
e[num].next=head[from];
head[from]=num;
}
bool bfs(){
memset(dep,0,sizeof(dep));
queue<int>q;q.push(s);dep[s]=1;
while(!q.empty()){
int u=q.front();q.pop();
for(int i=head[u];i;i=e[i].next){
int v=e[i].to;
if(!dep[v]&&e[i].c){
dep[v]=dep[u]+1;q.push(v);
}
}
}
return dep[t];
}
int dfs(int x,int cap){
if(x==t)return cap;
for(int& i=H[x];i;i=e[i].next){
int v=e[i].to;
if(dep[v]==dep[x]+1&&e[i].c){
int tmp=dfs(v,min(cap,e[i].c));
if(tmp){
e[i].c-=tmp;e[i^1].c+=tmp;
return tmp;
}
}
}
return 0;
}
int dinic(){
int ans=0;
while(bfs()){
for(int i=s;i<=t;i++)H[i]=head[i];
while(int f=dfs(s,inf))ans+=f;
}
return ans;
}
void solve(int mid){
cnt=0;
for(int i=1;i<=mid;i++){
for(int j=head[i];j;j=e[j].next){
int v=e[j].to;
if(!e[j].c&&v!=s){
line[++cnt]=v-1-mid;
continue;
}
}
}
}
bool judge(int mid){
memset(head,0,sizeof(head));
memset(H,0,sizeof(H));
memset(e,0,sizeof(e));
for(int i=1;i<=mid;i++){
add(i,xx[i]+mid,1);add(xx[i]+mid,i,0);
add(i,yy[i]+mid,1);add(yy[i]+mid,i,0);
}
for(int i=1;i<=n;i++)add(i+mid,t,1),add(t,i+mid,0);
for(int i=1;i<=mid;i++)add(s,i,1),add(i,s,0);
if(dinic()==mid){solve(mid);return true;}
else return false;
}
int main()
{
n=read();m=read();s=0;t=n+m+1;
for(int i=1;i<=m;i++){
xx[i]=read()+1;yy[i]=read()+1;
}
int l=0,r=m;
while(r>l){
int mid=(l+r+1)>>1;
if(judge(mid))l=mid;
else r=mid-1;
}
printf("%d\n",l);
for(int i=1;i<=cnt;i++)cout<<line[i]<<endl;
return 0;
}
[HNOI2006]超级英雄(二分+网络流)的更多相关文章
- bzoj 1191: [HNOI2006]超级英雄Hero 网络流_残量网络
题目描述: 现在电视台有一种节目叫做超级英雄,大概的流程就是每位选手到台上回答主持人的几个问题,然后根据回答问题的 多少获得不同数目的奖品或奖金.主持人问题准备了若干道题目,只有当选手正确回答一道题后 ...
- [HNOI2006]超级英雄 网络流+二分版
刚学网络流的我这里有一道非常好的"网络流练手题"------[HNOI2006]超级英雄. 记得很久以前真的有这个节目来着,还是大兵主持的. 其实这是一道匈牙利板子大水题,但对于我 ...
- BZOJ 1191: [HNOI2006]超级英雄Hero 二分匹配
1191: [HNOI2006]超级英雄Hero Description 现在电视台有一种节目叫做超级英雄,大概的流程就是每位选手到台上回答主持人的几个问题,然后根据回答问题的多少获得不同数目的奖品或 ...
- BZOJ 1191: [HNOI2006]超级英雄Hero(二分图匹配)
云神说他二分图匹配从来都是用网络流水过去的...我要发扬他的精神.. 这道题明显是二分图匹配.网络流的话可以二分答案+最大流.虽然跑得很慢.... -------------------------- ...
- bzoj 1191: [HNOI2006]超级英雄Hero
1191: [HNOI2006]超级英雄Hero Time Limit: 10 Sec Memory Limit: 162 MB 二分图匹配... Description 现在电视台有一种节目叫做超 ...
- bzoj 1191: [HNOI2006]超级英雄Hero 并查集 || 匈牙利算法
1191: [HNOI2006]超级英雄Hero Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1804 Solved: 850[Submit][S ...
- hihoCoder 1389 Sewage Treatment 【二分+网络流+优化】 (ACM-ICPC国际大学生程序设计竞赛北京赛区(2016)网络赛)
#1389 : Sewage Treatment 时间限制:2000ms 单点时限:2000ms 内存限制:256MB 描述 After years of suffering, people coul ...
- bzoj 1191 [HNOI2006]超级英雄Hero(最大基数匹配)
1191: [HNOI2006]超级英雄Hero Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2813 Solved: 1331[Submit][ ...
- POJ 2455 Secret Milking Machine(搜索-二分,网络流-最大流)
Secret Milking Machine Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9658 Accepted: ...
随机推荐
- 一个PHPer如何深入学习ES搜索引擎?
公司早在一年前就上ES作为后端搜索服务的项目 ,我们PHPer只是负责实现业务接口,es的一些查询,优化技巧由另一组同事(JAVAer)负责,有时,一个需求过来,改动较大时,需要更改查询json语句, ...
- STM8S汇编代码分析
转载:http://blog.csdn.net/u010093140/article/details/50021897使用STVD建立完汇编工程项目之后(具本建立方法可以看我的另一篇博文http:// ...
- swift语言点评二十-扩展
结论:扩展无法修改原来的数据结构. Extensions can add new functionality to a type, but they cannot override existing ...
- swift语言点评六-Numbers and Basic Values
Topics Logical Values struct Bool A value type whose instances are either true or false. Numeric Val ...
- NOIp2018模拟赛三十七
奇怪的一场... 前两题都是全场题,C题明显不可做,我题目都没看懂...(STO lhx OTZ) 成绩:100+100+8=208 貌似十几个208的...A题暴力$O(nmc)$能过...暴力容斥 ...
- 浏览器解析,HTTP/HTTPS、TCP/IP、WebSocket协议
浏览器相关 浏览器对同一个域名有连接数限制,大部分是 6. 浏览器指的是 Chrome.Firefox,而浏览器内核则是 Blink.Gecko,浏览器内核只负责渲染,GUI 及网络连接等跨平台工作则 ...
- phpstudy创建新站点-默认打不开
phpstudy中Apache中httpd.conf中如下语句前#要有 #Include conf/extra/httpd-vhosts.conf
- [LeetCode] 122. 买卖股票的最佳时机ii best-time-to-buy-and-sell-stock-ii(贪心算法)
思路: 只要第二天的价格高于第一天,就进行交易.(这样的话就默认可以同一天内先卖出再买进) class Solution(object): def maxProfit(self, prices): & ...
- Visual Studio 2013 无法创建MVC项目,系统找不到指定的文件.(Exception from HRESULT:08x0070002)
在Visual Studio 2013中创建新MVC项目,(PS:现在创建个MVC项目,差点都找不到在哪,汗!-) 确定后提示,系统找不到指定的文件.(Exception from HRESULT:0 ...
- C语言过程活动记录
C 语言自动提供的服务之一就是跟踪调用链——哪些函数调用了哪些函数,当下一个return语句执行后,控制将返回何处等.解决这个问题的经典机制是堆栈中的活动记录. 当每个函数被调用时,都会产生一个过程记 ...