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后发现题面上说了一旦没回答出一道题就结束 ...
随机推荐
- VMware虚拟机上安装CentOS 7
下载CentOS7,点击网址下载,地址:http://isoredirect.centos.org/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-1804.iso ...
- java中Date与String转化 string转float
这种转换要用到java.text.SimpleDateFormat类 字符串转换成日期类型: 方法1: Date date=new Date("2017-02-01"); 方法2: ...
- Spring Boot 配置Oracle数据库
1.添加oralce 依赖包,仓库没有则通过maven装载到本地仓库: 2.application.properties 中添加配置,特别是第一个配置项要严重注意! spring.jpa.databa ...
- POJ 1474
半平面交模板 #include <iostream> #include <cstdio> #include <cstring> #include <algor ...
- cocos2d-android学习四 ---- 精灵的创建
上篇文章我们创建了一个黑乎乎的界面.以下我们就给它增加一个精灵. 我们这次就一起来学习精灵的基础知识. 1.什么是精灵 游戏中全部会动的对象都是精灵,能够是主人公,背景元素,一个子弹或者是敌人. 一个 ...
- 聚类k-means/k-means++/fcm学习笔记
聚类主要是一种无监督学习.用来发现未标注数据的隐藏结构,主要是用来给数据分组.聚类算法一般有硬聚类(k-means,k-means++)和软聚类FCM(fuzzy c-means).聚类眼下广泛应用于 ...
- spring之注解(一)概述
Spring的核心是依赖注入(DI),而依赖注入的基础是依赖信息的配置.这些配置称之为元数据. 在之前的的学习中.一直採用的是基于xml的配置,这些元数据配置在spring内部被注冊成为BeanDef ...
- 网页设计——Dreamweaver
在看ASP.NET视频时,讲到了一款编写HTML代码的软件--Dreamweaver.它是一款专门进行网页设置的软件.通过它能够设计出多彩的界面,相对于vs中自带的设计方式来说,他不须要知道太多的技术 ...
- linux下图片转换工具[【转】
本文转载自:https://linux.cn/article-8014-1.html 计算机术语中,批处理指的是用一个非交互式的程序来执行一序列的任务的方法.这篇教程里,我们会使用 Linux 命令行 ...
- 网络 - TCP/IP四层模型,面向生产
TCP.IP四层模型 (网络接口层,网际互联层,传输层,应用层.) (左边是车模,右边是实际生产的车.) 物理层,负责0101比特流传递. 数据链路层,MAC地址负责局域网,内网通信.MAC地址,由4 ...