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后发现题面上说了一旦没回答出一道题就结束 ...
随机推荐
- FusionCharts,双折线图和双柱状图
一个电商项目中,用到了"双柱状图",对比 当前库存和累计库存. 网上找了好几个贴子,才找到具体用法. 代码整理下,以备不时之需. 效果图-双折线图 效果图-双柱状图 <%@ ...
- lunix下的redis数据库操作——hash(哈希)
哈希,形如:key : (field : value) 创建:(可以理解为users用户,name为xxx) hset users name xxx 查看: hget users name # &qu ...
- fzu 2132
#include<stdio.h> double h; double tt; void s(long long m,long long n) { long long i,j,sum; j= ...
- 搭建单机CDH环境,并更新spark环境
搭建单机CDH环境,并更新spark环境 1,安装VMWare Player,http://dlsw.baidu.com/sw-search-sp/soft/90/13927/VMware_playe ...
- Lua 与C/C++ 交互系列:注冊枚举enum到Lua Code中
在Lua Code中注冊C/C++的枚举很easy,就像注冊全局变量一样.我们使用枚举名称作为命名空间,来避免注冊的枚举发生冲突.注冊的枚举存储在全局环境(线程环境)中. 当在Lua Code中訪问枚 ...
- selenium找到页面元素click没反应
问题描述:通过调试可以看到控制台已经找到了起诉入口页面元素,可是点击“我是原告”没有反应了,也没有报错 解决办法:登录时是跳进了两层的iframe中,需要跳出iframe才能找到我是原告.
- php 在同一个表单中加入和改动
大家写站点的时候可能都会遇到这样的情况,就是写一个表单,这个表单是用来加入一篇文章的,我们屁颠屁颠的在后台接收数据,然后存入数据库.如今有个问题.当你要对该文章进行改动的时候,你是怎么处理的? 我的方 ...
- 【C语言】编写函数,将一个数的指定位置置0或置1
//编写函数,将一个数的指定位置置0或置1 #include <stdio.h> unsigned int set_bit(unsigned int num, int pos, int f ...
- spy++ 句柄消息详解
使用spy++捕获到的消息详解 主要是今天正好自己用到. 原来也有用过SPY++查看消息,然后自己SendMessage或者PostMessage 直接发送消息给目标程序.但是原来一用就有效果,今天要 ...
- SwiftUI 官方教程(一)
完整中文教程及代码请查看 https://github.com/WillieWangWei/SwiftUI-Tutorials 创建和组合 View 此部分将指引你构建一个发现和分享您喜爱地方的 ...