[HNOI2006]超级英雄 网络流+二分版
刚学网络流的我这里有一道非常好的"网络流练手题"------[HNOI2006]超级英雄.
记得很久以前真的有这个节目来着,还是大兵主持的.
其实这是一道匈牙利板子大水题,但对于我们这种刚学网络流的 juruo 碰到什么题不用网络流做就非常的不爽,于是就有了这个 超级英雄 网络流+二分版.
这里直接二分答案,每次将源点和所有的锦囊连边,容量为1;再将锦囊和对应的问题连边,容量为1;最后是将问题和汇点T连边,容量还是1.然后跑一波Dinic,看是否满流,这道"网络流练手题就搞定了".
最后再吐槽一下:这道题的网络流打法非常非常优秀(比匈牙利慢而且代码量翻倍),没事干的时候可以打着玩儿......
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#define inf (1<<30)
#define maxn (300050)
#define maxm (300050)
#define ll long long
#define il inline
#define RG register
using namespace std;
il int gi(){
RG int x=0,q=1; RG char ch=getchar();
while( ( ch<'0' || ch>'9' ) && ch!='-' ) ch=getchar();
if( ch=='-' ) q=-1,ch=getchar();
while(ch>='0' && ch<='9') x=x*10+ch-48,ch=getchar();
return q*x;
}
int S,T,n,m,num=1,F,que[maxn*5],level[maxn];
struct data{ int a,b; }ques[maxn];
int head[maxn],nxt[maxm],to[maxm],w[maxm];
il void add( int u,int v,int d ){
nxt[++num]=head[u];to[num]=v;w[num]=d;head[u]=num;
nxt[++num]=head[v];to[num]=u;w[num]=0;head[v]=num; }
il bool bfs(){
for(int i=S;i<=T;i++) level[i]=0;
que[0]=S,level[S]=1;
RG int hd=0,tl=1;
while(hd<tl){
RG int x=que[hd++];
if(x==T) return true;
for(int i=head[x];i;i=nxt[i]){
RG int v=to[i];
if(w[i] && !level[v]){
level[v]=level[x]+1;
que[tl++]=v;
}
}
}
return false;
}
il int dfs(RG int x,RG int maxf){
if(x==T) return maxf;
RG int ans=0;
for(RG int i=head[x];i;i=nxt[i]){
RG int v=to[i],f=w[i];
if(level[v]==level[x]+1 && f){
RG int minn=min(f,maxf-ans);
f=dfs(v,minn);
w[i]-=f,w[i^1]+=f,ans+=f;
if(ans==maxf) break;
}
}
if(!ans) level[x]=0;
return ans;
}
il void Dinic(){ while(bfs()) F+=dfs(S,inf); }
il bool check(int mid){
memset(head,0,sizeof(head)); num=1; F=0;
for(int i=1;i<=n;i++) add(S,i,1);
for(int i=1;i<=mid;i++){
add(ques[i].a,i+n,1); add(ques[i].b,i+n,1); add(i+n,T,1);
}
Dinic();
if(F>=mid) return 1;
else return 0;
}
il void init(){
n=gi(),m=gi();S=0,T=n+m+1;
for(int i=1;i<=m;i++) ques[i].a=gi()+1,ques[i].b=gi()+1;
}
il void work(){
int l=0,r=m,ans=0;
while(l<=r){
RG int mid=(l+r)>>1;
if( check(mid) ) l=mid+1,ans=mid;
else r=mid-1;
}
printf("%d\n",ans);
}
int main(){ init(); work(); return 0; }
最后顺便再附上匈牙利版代码:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int map[1001][1001],club[1001];
int n,m;
bool vis[1001];
bool dfs(int x){
for(int i=0;i<n;i++)
if(!vis[i]&&map[x][i]){
vis[i]=1;
if( !club[i]||dfs(club[i]) ){ club[i]=x; return true; }
}
return false;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
int x,y;
scanf("%d%d",&x,&y);
map[i][x]=map[i][y]=1;
}
int ans=0;
for(int i=1;i<=m;i++){
memset(vis,0,sizeof(vis));
if(dfs(i))ans++;
else break;
}
printf("%d\n",ans);
return 0;
}
[HNOI2006]超级英雄 网络流+二分版的更多相关文章
- [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 ...
- bzoj 1191 [HNOI2006]超级英雄Hero(最大基数匹配)
1191: [HNOI2006]超级英雄Hero Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2813 Solved: 1331[Submit][ ...
- POJ Secret Milking Machine 【网络流+二分】
题意:各一个地图,两点之间有若干条路,要在节点1和节点n之间行走t次(就是问1到n的路径数至少为t,每一条路径不能有重复),问所有路径里面最长的部分(这个题目特别强调,不是路径长度和,是路径中相邻两点 ...
- 1191: [HNOI2006]超级英雄Hero
1191: [HNOI2006]超级英雄Hero Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1996 Solved: 946[Submit][S ...
- [luogu P2319] [HNOI2006]超级英雄
[luogu P2319] [HNOI2006]超级英雄 题目描述 现在电视台有一种节目叫做超级英雄,大概的流程就是每位选手到台上回答主持人的几个问题,然后根据回答问题的多少获得不同数目的奖品或奖金. ...
随机推荐
- CPU-Z五大主要功能及使用方法初步了解
CPU-Z这款软件除了具有查看CPU温度这个功能之外,还有很多其他的功能.今天就和小编一起去看看CPU-Z的5大功能以及他们的使用方法吧! CPU信息标签页 CPU-Z介绍: CPU-Z是一款著名的免 ...
- 每天一个JS 小demo之商品筛选。主要知识点:DOM方法综合运用
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"& ...
- Redis数据类型之List(三)
前言:list即链表,它是一个能维持数据先后顺序的列表,便于在表的两端追加和删除数据,中间位置的存取具有O(N)的时间复杂度,是一个双向链表. 一.内部原理 redis ...
- Rhythmbox音乐播放器常见问题
一.歌名中文乱码 对于所有用gstreamer做后端的播放器,如Rhythmbox, 设置如下的环境变量后即可正确读取mp3中GBK编码的id3 tag. export GST_ID3_TAG_ENC ...
- C# 微信 企业号通知消息
每当有个Create 事件,要通知相关的人员. 1.扫码登录企业微信,到企业应用. 2.获取微信配置信息. Secret和AgentId. 3.管理通讯录,配置接收消息的人群.可以按照部门,标签.获取 ...
- Builder模式详解及其在Android开发中的应用
一.引言 在Android开发中,采用Builder模式的代码随处可见,比如说Android系统对话框AlertDialog的使用或者是Android中的通知栏(Notification)的使用,又比 ...
- 【CC2530入门教程-04】CC2530的定时/计数器原理与应用
第4课 CC2530的定时/计数器原理与应用 广东职业技术学院 欧浩源 一.定时/技术器的基本原理 定时/计数器,是一种能够对内部时钟信号或外部输入信号进行计数,当计数值达到设定要求时,向CPU提 ...
- Spring中多个工程停多个资源文件ignoreUnresolvablePlaceholders配置
http://www.imooo.com/ruanjiangongcheng/software-architecture-design/667686.htm
- mysql update 批量更新
UPDATE cntheater SET title = (SELECT title FROM cntheater_copy WHERE cntheater.id = cntheater_copy.i ...
- java中byte, iso-8859-1, UTF-8,乱码的根源
Post@https://ryan-miao.github.io 背景 还是多语言, 在项目中遇到本地环境和服务端环境不一致乱码的情形.因此需要搞清楚乱码产生的过程,来分析原因. 获取多语言代码如下: ...