一个不能更清楚的网络流介绍

↑虽然不是我写的但是观摩一下总是没问题的嗯

 
看到晗神学的是神奇的ek算法.
但是看起来还是Ford-Fulkerson比较简单..所以我就学了这个...嗯其他的先看看..这个似乎比较好上手....
 
从题目要求来看,我们只需要建一个双向图,然后用神奇的网络流算法算出到终点的最大流量-1即可 ( 因为留一条路出来就可以满足来回不能只经过每个土地1次或者0次 )
 但是并不对
 
如上为本题某数据 ( 好像是in3 ) 的建图[我知道我画的很丑],所示从1到7的流为2,但是放狗数为0,说明这个建图太naive了,报道出了偏差;
很明显,这个建法错误的原因是点4被经过了两次,但是事实上每个点只能经过一次,普通的建图并不能完成这个要求;
我们需要的是限制每个点的流量,那么我们把每个点变成流量为1的边 参考晗神博客 )如下图
(少写一个4假装没看见好了,最后的7看起来很像1就像吧..)
这些点i与i+n相连的边,边权都为1,这样就做到了每个"点"经过一次,起点和终点不需要流量限制所以注意特判
 
所以最恶心的是为什么我完全没考虑每个点的流量就能写90分???????滔天的水扑面而来啊摔
顺便存一个丑代码
 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib>
using namespace std;
const int minf=;
int n,m;
struct nod{
int rev;
int y;
int next;
int v;
}e[];
int head[]={};
int tot=;
bool vis[]={};
inline void init(int x,int y,int v,int rev){
e[++tot].y=y;
e[tot].next=head[x];
e[tot].v=v;
e[tot].rev=rev;
head[x]=tot;
}
inline int dis(int x){
return x+n;
}
int dfs(int s,int t,int f){
if(s==t){
return f;
}
vis[s]=;
for(int i=head[s];i;i=e[i].next){
int v=e[i].v,y=e[i].y;
if(vis[y]==&&v>){
int d=dfs(y,t,min(f,v));
if(d>){
e[i].v-=d;
e[e[i].rev].v+=d;
return d;
}
}
}
return ;
}
int main(){
//freopen("wtf.in","r",stdin);
scanf("%d%d",&n,&m);
int x,y;
for(int i=;i<n;i++){
init(i,i+n,,tot+);
init(i+n,i,,tot);
}
for(int i=;i<=m;i++){
scanf("%d%d",&x,&y);
if(x>y){
swap(x,y);
}
if(y==n){
init(x+n,y,,tot+);
init(y,x+n,,tot);
init(y,x+n,,tot+);
init(x+n,y,,tot);
}
else if(x==){
init(,y,,tot+);
init(y,,,tot);
init(y,,,tot+);
init(,y,,tot);
}
else{
init(x+n,y,,tot+);
init(y,x+n,,tot);
init(y+n,x,,tot+);
init(x,y+n,,tot);
}
}
int ans=;
for(;;){
memset(vis,,sizeof(vis));
int f=dfs(,n,minf);
if(f==){
break;
}
ans+=f;
}
if(ans==){
printf("%d\n",ans);
}
else
printf("%d\n",ans-);
return ;
}

网络流小结+[jzyzoj p1320] patrol的更多相关文章

  1. 【jzyzoj】【p1320 patrol】 巡逻(网络流最小割例题)

    描述 Description FJ有个农场,其中有n块土地,由m条边连起来.FJ的养牛场在土地1,在土地n有个新开张的雪糕店.Bessie经常偷偷溜到雪糕店,当Bessie去的时候,FJ就要跟上她.但 ...

  2. 网络流小结(HNOI2019之前)

    \(\text{一:Dinic最大流}\) 最坏复杂度 \({\mathcal O(n^2m)}\) 一般可以处理 \(10^4\) ~ \(10^5\) 的网络. struct Edge { int ...

  3. BZOJ 1497 JZYZOJ 1344 [NOI2006]最大获利 网络流 最大权闭合图

    http://www.lydsy.com/JudgeOnline/problem.php?id=1497 http://172.20.6.3/Problem_Show.asp?id=1344   思路 ...

  4. [bzoj1565][NOI2009]植物大战僵尸_网络流_拓扑排序

    植物大战僵尸 bzoj1565 题目大意:给你一张网格图,上面种着一些植物.你从网格的最右侧开始进攻.每个植物可以对僵尸提供能量或者消耗僵尸的能量.每个植物可以保护一个特定网格内的植物,如果一个植物被 ...

  5. [bzoj1497][NOI2006]最大获利_网络流_最小割

    最大获利 bzoj-1497 题目大意:可以建立一个点,花费一定的代价:将已经建立的两个点之间连边,得到一定收益.有些节点之间是不允许连边的. 注释:1<=点数<=5,000,1<= ...

  6. [luogu1402]酒店之王_网络流

    酒店之王 luogu-1402 题目大意:有n个人,p道菜,q个房间,每个人喜欢吃一些菜.喜欢住一些房间,如果一个人即住到了他喜欢的房间有吃到了他喜欢的菜,就对答案贡献++,求最大贡献. 注释:1&l ...

  7. [jdoj1817]Drainage Ditches_网络流

    Drainage Ditches jdoj-1817 题目大意:网络流裸求最大流 注释:n(点数),m(边数)<=200. 想法:裸的网络流求最大流,用bfs+dfs,美其名曰dinic. 没有 ...

  8. 网络流 最大流—最小割 之SAP算法 详解

    首先引入几个新名词: 1.距离标号: 所谓距离标号 ,就是某个点到汇点的最少的弧的数量(即边权值为1时某个点到汇点的最短路径长度). 设点i的标号为level[i],那么如果将满足level[i]=l ...

  9. 【做题】POJ3469 Dual Core CPU——第一道网络流

    刚学了Dinic就开始做题,然后就崩了. 题意:若干个任务,可以放在两个CPU中任意一个上完成,各有一定代价.其中又有若干对任务,如果它们不在同一个CPU上完成,会产生额外代价.最小化并输出代价. 一 ...

随机推荐

  1. Milking Cows 挤牛奶

    1.2.1 Milking Cows 挤牛奶 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 554  Solved: 108[Submit][Status ...

  2. python操作YAML文件之pyyaml库

    1. YAML简介 YAML是一种被认为可以超越XML.JSON的配置文件,最早接触是Spring Boot,木有想到python也是支持的,遂研究一下. python解析YAML库叫做pyyaml, ...

  3. lintcode 40. 用栈实现队列

    使用两个栈来回倒腾可以实现队列. AC代码: import java.util.Stack; public class Queue { private Stack<Integer> sta ...

  4. zedboard学习记录.3.oled,创建IP

    环境:win7 .vivado 2017.4 .zedboard rev.d 首先建立工程. 1.Tools -> Create and Package New IP 2.Create AXI4 ...

  5. python-num18 - django进阶一

    一.深入django的路由系统 下面为django的请求生命周期 下面来看下整个生命周期中的路由系统: 在Django的urls中我们可以根据一个URL对应一个函数名来定义路由规则如下: " ...

  6. laravel学习教程整理

    百度传课:https://chuanke.baidu.com/v5847462-219167-1421398.html

  7. docker 升级后,配置 idea 连接 docker

    [root@A01-R02-I188-87 ~]# docker version Client: Version: 18.06.1-ce API version: 1.24 Go version: g ...

  8. C++中string.find()函数,string.find_first_of函数与string::npos

    查找字符串a是否包含子串b,不是用strA.find(strB) > 0而是strA.find(strB) != string:nposstring::size_type pos = strA. ...

  9. Linux 用户态与内核态的交互【转载】

    Linux 用户态与内核态的交互  在 Linux 2.4 版以后版本的内核中,几乎全部的中断过程与用户态进程的通信都是使用 netlink 套接字实现的,例如iprote2网络管理工具,它与内核的交 ...

  10. HTML标签学习之路-001

    1.html的注释 <!--这里是注释内容--> <!--代表注释内容的开始 -->代表注释内容结束 注释部分,不会被浏览器输出,只是作为代码的说明,供开发者查阅 2.HTML ...