题目描述:

现在电视台有一种节目叫做超级英雄,大概的流程就是每位选手到台上回答主持人的几个问题,然后根据回答问题的
多少获得不同数目的奖品或奖金。主持人问题准备了若干道题目,只有当选手正确回答一道题后,才能进入下一题
,否则就被淘汰。为了增加节目的趣味性并适当降低难度,主持人总提供给选手几个“锦囊妙计”,比如求助现场
观众,或者去掉若干个错误答案(选择题)等等。这里,我们把规则稍微改变一下。假设主持人总共有m道题,选
手有n种不同的“锦囊妙计”。主持人规定,每道题都可以从两种“锦囊妙计”中选择一种,而每种“锦囊妙计”
只能用一次。我们又假设一道题使用了它允许的锦囊妙计后,就一定能正确回答,顺利进入下一题。现在我来到了
节目现场,可是我实在是太笨了,以至于一道题也不会做,每道题只好借助使用“锦囊妙计”来通过。如果我事先
就知道了每道题能够使用哪两种“锦囊妙计”,那么你能告诉我怎样选择才能通过最多的题数吗?
 
 
题解: 
 

首先,二分肯定是可以的.

不过,我们用残量网络做更优美一些.

依次枚举每一个人,并将该人对应的边都连上.

如果每次在残量网络上都能增广出一个流量,那么就说明新加入的是可以的.

为什么在残量网络上跑是正确的呢 ?

我们关注这个函数:

int maxflow(){
memset(current,0,sizeof(current));
int ans=0;
while(BFS()) ans+=dfs(st,inf);
return ans;
}

这意味着,Dinic 求最大流过程中每次都是试图从起点向终点找出一条增广路.

而每次增广出的流量是可以累加的.

所以,在新增的残量网络上求出的流量也就可以和先前的流量累加了,互不干扰.

最后,一定特判一下重边的情况!!!

Code:

// luogu-judger-enable-o2
// luogu-judger-enable-o2
// luogu-judger-enable-o2
// luogu-judger-enable-o2
#include<bits/stdc++.h>
#define maxn 100000
#define inf 20000
#define setIO(s) freopen(s".in","r",stdin)
#define nex 1303
using namespace std;
int A[maxn],B[maxn];
namespace Dinic{
int st,ed;
struct Edge{
int from,to,cap;
Edge(int u,int v,int c):from(u),to(v),cap(c){};
};
vector<Edge>edges;
vector<int>G[maxn];
void add(int u,int v,int c){
edges.push_back(Edge(u,v,c));
edges.push_back(Edge(v,u,0));
int m=edges.size();
G[u].push_back(m-2);
G[v].push_back(m-1);
}
int d[maxn],vis[maxn],current[maxn];
queue<int>Q;
int BFS(){
memset(vis,0,sizeof(vis));
d[st]=0,vis[st]=1; Q.push(st);
while(!Q.empty()) {
int u=Q.front(); Q.pop();
int sz=G[u].size();
for(int i=0;i<sz;++i){
Edge r = edges[G[u][i]];
if(r.cap>0 && !vis[r.to]) {
vis[r.to]=1,d[r.to]=d[u]+1;
Q.push(r.to);
}
}
}
return vis[ed];
}
int dfs(int x,int cur){
if(x==ed) return cur;
int f,flow=0;
for(int v=G[x].size(),i=current[x];i<v;++i){
current[x]=i;
Edge r = edges[G[x][i]];
if(r.cap>0 && d[r.to]==d[x]+1) {
f=dfs(r.to,min(cur,r.cap));
cur-=f,flow+=f;
edges[G[x][i]].cap-=f,edges[G[x][i]^1].cap+=f;
}
if(cur==0) break;
}
return flow;
}
int maxflow(){
memset(current,0,sizeof(current));
int ans=0;
while(BFS()) ans+=dfs(st,1);
return ans;
}
void re(){
edges.clear();
for(int i=0;i<maxn;++i) G[i].clear();
memset(current,0,sizeof(current));
memset(d,0,sizeof(d));
memset(vis,0,sizeof(vis));
}
};
int C[maxn],D[maxn];
int check[maxn];
int main(){
// setIO("input");
int n,m;
scanf("%d%d",&n,&m);
int ans=0;
Dinic::st=0,Dinic::ed=3000;
for(int i=1;i<=m;++i) Dinic::add(0,i,1);
for(int i=0;i<n;++i) Dinic::add(i+nex,3000,1);
for(int i=1;i<=m;++i){
scanf("%d%d",&A[i],&B[i]);
Dinic::add(i,A[i]+nex,1), C[i]=Dinic::edges.size()-2;
if(A[i]!=B[i]) Dinic::add(i,B[i]+nex,1);
if(Dinic::maxflow()<1) break;
ans=i;
}
printf("%d\n",ans);
for(int i=1;i<=ans;++i) {
if(Dinic::edges[C[i]].cap==0) printf("%d\n",A[i]);
else printf("%d\n",B[i]);
} return 0;
}

  

bzoj 1191: [HNOI2006]超级英雄Hero 网络流_残量网络的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. BZOJ 1191: [HNOI2006]超级英雄Hero 匈牙利算法

    1191: [HNOI2006]超级英雄Hero Time Limit: 2 Sec  Memory Limit: 256 MBSubmit: xxx  Solved: 2xx 题目连接 http:/ ...

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

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

  8. BZOJ 1191 [HNOI2006]超级英雄Hero:二分图匹配 匈牙利算法

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1191 题意: 有m道题,每答对一题才能接着回答下一个问题. 你一道题都不会,但是你有n个“ ...

  9. bzoj 1191 [HNOI2006]超级英雄Hero——二分图匹配

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1191 不就是个最大匹配么. 结果WA得不行. 看TJ后发现题面上说了一旦没回答出一道题就结束 ...

随机推荐

  1. android 手机网络接入点名称及WAP、NET模式的区别

    移动 电信 联通 APN cmwap cmnet ctwap ctnet 3gwap uniwap 3gnet uninet设置 APN(Access Point Name),即“接入点名称”,用来标 ...

  2. 【ZOJ 4060】Flippy Sequence

    [链接] 我是链接,点我呀:) [题意] [题解] 按照两个区间的排列方式 我们可以分成以下几种情况 会发现这两个区间的作用 最多只能把两段连续不同的区间变为相同. 那么写个for处理出连续不相同的一 ...

  3. (35)Spring Boot集成Redis实现缓存机制【从零开始学Spring Boot】

    [本文章是否对你有用以及是否有好的建议,请留言] 本文章牵涉到的技术点比较多:Spring Data JPA.Redis.Spring MVC,Spirng Cache,所以在看这篇文章的时候,需要对 ...

  4. win10使用WampServer部署magento

     1.安装wampserver及php.apache.mySQL组件,访问http://www.wampserver.com/en/#download-wrapper,下载以下文件并依次安装:     ...

  5. windowsclient开发--为你clientsign一个签名证书

    郑重声明:该方法自娱自乐,尽管写入了签名,可是在微软系统免签证书不是合格的. 什么是签名? 话不多说,上图(没图说个xx): 微信windowsclient.exe安装文件: 再看还有一个.exe文件 ...

  6. ftk学习记(label篇)

    [ 声明:版权全部,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 还是接着上面的一篇博文. 之前以前答应过大家,让大家看一下最简单的ftk程序是怎么执行的.所以 ...

  7. C算法与数据结构-线性表的应用,多项式求和---ShinePans

    /*---上机作业作业,二项式加法---*/ /*---By 潘尚 ---*/ /*---日期: 2014-5-8 . ---*/ /*---题目:---*/ //如果有两个稀疏多项式A和B,设计算法 ...

  8. 2016.04.03,英语,《Vocabulary Builder》Unit 09

    her/hes:  from the Latin verb haerere, means 'to stick' or 'to get stuck'. adhesive means 'sticking' ...

  9. 18.29SSM基础整合开发

    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/d ...

  10. php简单测试slim框架的功能

    php简单测试slim框架的功能 监听主路径/ $app->get( '/', function () { $template = <<<EOT<!DOCTYPE htm ...