刚学网络流的我这里有一道非常好的"网络流练手题"------[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]超级英雄 网络流+二分版的更多相关文章

  1. [HNOI2006]超级英雄(二分+网络流)

    [HNOI2006]超级英雄 题目描述 现在电视台有一种节目叫做超级英雄,大概的流程就是每位选手到台上回答主持人的几个问题,然后根据回答问题的多少获得不同数目的奖品或奖金.主持人问题准备了若干道题目, ...

  2. BZOJ 1191: [HNOI2006]超级英雄Hero 二分匹配

    1191: [HNOI2006]超级英雄Hero Description 现在电视台有一种节目叫做超级英雄,大概的流程就是每位选手到台上回答主持人的几个问题,然后根据回答问题的多少获得不同数目的奖品或 ...

  3. BZOJ 1191: [HNOI2006]超级英雄Hero(二分图匹配)

    云神说他二分图匹配从来都是用网络流水过去的...我要发扬他的精神.. 这道题明显是二分图匹配.网络流的话可以二分答案+最大流.虽然跑得很慢.... -------------------------- ...

  4. bzoj 1191: [HNOI2006]超级英雄Hero

    1191: [HNOI2006]超级英雄Hero Time Limit: 10 Sec  Memory Limit: 162 MB 二分图匹配... Description 现在电视台有一种节目叫做超 ...

  5. bzoj 1191: [HNOI2006]超级英雄Hero 并查集 || 匈牙利算法

    1191: [HNOI2006]超级英雄Hero Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1804  Solved: 850[Submit][S ...

  6. bzoj 1191 [HNOI2006]超级英雄Hero(最大基数匹配)

    1191: [HNOI2006]超级英雄Hero Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2813  Solved: 1331[Submit][ ...

  7. POJ Secret Milking Machine 【网络流+二分】

    题意:各一个地图,两点之间有若干条路,要在节点1和节点n之间行走t次(就是问1到n的路径数至少为t,每一条路径不能有重复),问所有路径里面最长的部分(这个题目特别强调,不是路径长度和,是路径中相邻两点 ...

  8. 1191: [HNOI2006]超级英雄Hero

    1191: [HNOI2006]超级英雄Hero Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1996  Solved: 946[Submit][S ...

  9. [luogu P2319] [HNOI2006]超级英雄

    [luogu P2319] [HNOI2006]超级英雄 题目描述 现在电视台有一种节目叫做超级英雄,大概的流程就是每位选手到台上回答主持人的几个问题,然后根据回答问题的多少获得不同数目的奖品或奖金. ...

随机推荐

  1. CC2530入门教程-02】CC2530的通用I/O端口输入和输出控制

    第2课  CC2530的通用I/O端口输入和输出控制 广东职业技术学院  欧浩源 一.CC2530的引脚概述 CC2530微控制器采用QFN40封装,有40 个引脚.其中,有21个数字I/O端口,其中 ...

  2. ecshop和jQuery冲突

    这个问题看ecshop的论坛里有很多帖子,解决方案就好几种,但是有几个标注完美解决方案的需要更改很多文件,对于我们这种初学者出现了问题的话是不知道怎么调试的. 找到一个很简单的解决方案,论坛里说只能解 ...

  3. 玩转spring boot——websocket

    前言 QQ这类即时通讯工具多数是以桌面应用的方式存在.在没有websocket出现之前,如果开发一个网页版的即时通讯应用,则需要定时刷新页面或定时调用ajax请求,这无疑会加大服务器的负载和增加了客户 ...

  4. vue setTimeout用法 jquery滚动到某一个div的底部

    //vue 中setTimeOut用法 var $this = this; setTimeout(function(){ $this.goEnd() }, 10); goEnd:function(){ ...

  5. Pycharm直接连接Github

    Pycharm可以说是使用Python语言开发者的必备利器.高校学生有学生邮箱就可以免费使用,着实省了我不少银两.附个license图: Git是一个开源的分布式版本控制系统,用以有效.高速的处理从很 ...

  6. kbengine 常见问题汇总

    Q: KBEngine是什么,能用来做什么?A: KBEngine是一个通用网络游戏服务器引擎,适合绝大多数中心拓扑结构的网络游戏,包括但不限于即时和回合制MMORPG.副本类.房间类.卡牌.棋牌等. ...

  7. 二、Solr单机版的搭建

    1.1. 运行环境 solr 需要运行在一个Servlet容器中,Solr4.10.3要求jdk使用1.7以上,Solr默认提供Jetty(java写的Servlet容器),本次使用Tocmat作为S ...

  8. usaco training 4.1.2 Fence Rails 题解

    Fence Rails题解 Burch, Kolstad, and Schrijvers Farmer John is trying to erect a fence around part of h ...

  9. AugularJS从入门到实践(一)

      前  言  前端    AngularJS是为了克服HTML在构建应用上的不足而设计的.(引用百度百科) AngularJS使用了不同的方法,它尝试去补足HTML本身在构建应用方面的缺陷.Angu ...

  10. JFile的导入xlsx与xls

    首先需要有JAVA的一些jar包 下载地址:http://download.csdn.net/detail/qq_35980546/9892511 你要先配置好路由,还有能拿到绝对路径才行 下面直接给 ...