bzoj 1191: [HNOI2006]超级英雄Hero 网络流_残量网络
题目描述:
首先,二分肯定是可以的.
不过,我们用残量网络做更优美一些.
依次枚举每一个人,并将该人对应的边都连上.
如果每次在残量网络上都能增广出一个流量,那么就说明新加入的是可以的.
为什么在残量网络上跑是正确的呢 ?
我们关注这个函数:
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 网络流_残量网络的更多相关文章
- 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 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][ ...
- BZOJ 1191: [HNOI2006]超级英雄Hero 匈牙利算法
1191: [HNOI2006]超级英雄Hero Time Limit: 2 Sec Memory Limit: 256 MBSubmit: xxx Solved: 2xx 题目连接 http:/ ...
- BZOJ 1191: [HNOI2006]超级英雄Hero(二分图匹配)
1191: [HNOI2006]超级英雄Hero Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 6263 Solved: 2799[Submit][ ...
- BZOJ 1191 [HNOI2006]超级英雄Hero:二分图匹配 匈牙利算法
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1191 题意: 有m道题,每答对一题才能接着回答下一个问题. 你一道题都不会,但是你有n个“ ...
- bzoj 1191 [HNOI2006]超级英雄Hero——二分图匹配
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1191 不就是个最大匹配么. 结果WA得不行. 看TJ后发现题面上说了一旦没回答出一道题就结束 ...
随机推荐
- [bzoj1552\bzoj2506][Cqoi2014]robotic sort 排序机械臂_非旋转Treap
robotic sort 排序机械臂 bzoj-1552 bzoj-2506 Cqoi-2014 题目大意:给定一个序列,让你从1到n,每次将[1,p[i]]这段区间反转,p[i]表示整个物品权值第i ...
- [Angular] Performance Caching Policy - Cache First, Network Last
If you want to cache API response by using angular service-worker, you can do it in: src/ngsw-config ...
- jQuery学习之开篇
吐槽 近期比較烦,对于一个前端白痴来说,工作方向突然转向前端这块着实让人蛋疼无比.前段时间简单的学习了下EasyUI,算是对其有一个简单的认知了吧.EasyUI的研究过程中发现,假设没有掌握JS.JQ ...
- 【Storm】storm安装、配置、使用以及Storm单词计数程序的实例分析
前言:阅读笔记 storm和hadoop集群非常像.hadoop执行mr.storm执行topologies. mr和topologies最关键的不同点是:mr执行终于会结束,而topologies永 ...
- Linux命令(九)——系统监视和进程控制
与windows系统一样,linux系统中也有很多进程在同时运行,每个进程都有一个识别码PID,它是进程的唯一识别标志. 一.进程的类型 1.系统进程 在操作系统启动后,系统环境平台运行所加载的进程, ...
- PHP反射类的理解(代码篇)
<?php/** * Created by PhpStorm. * User: * Date: 2017/6/12 * Time: 14:34 * 关于反射类的理解 */class Person ...
- linux for LVM 创建笔记
LVM: 1.创建pv(物理卷) [root@localhost dev]# pvcreate /dev/sdd /dev/sde /dev/sdf Writing physical volume d ...
- zjnu 1181 石子合并(区间DP)
Description 在操场上沿一直线排列着 n堆石子. 现要将石子有次序地合并成一堆.规定每次仅仅能选相邻的两堆石子合并成新的一堆, 并将新的一堆石子数记为该次合并的得分.同意在第一次合并前对调一 ...
- 【Codeforces 258A】 Game With Sticks
[题目链接] http://codeforces.com/contest/451/problem/A [算法] 若n和m中的最小值是奇数,则先手胜,否则后手胜 [代码] #include<bit ...
- HTML不熟悉方法总结
1. onblur 属性在元素失去焦点时触发. 2. onfocus 属性在元素获得焦点时触发. 3.addEventlistener 事件监听 4.focus() 方法用于给予该元素焦点.这样用 ...