网络流 最大流SAPkuangbin模板
hdu 1532 求1~n的最大流
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std; const int MAXN = ; //点数的最大值
const int MAXM = ; //边数的最大值
const int INF = 0x3f3f3f3f; struct Node
{
int from, to, next;
int cap;
} edge[MAXM];
int tol;
int head[MAXN];
int dep[MAXN];
int gap[MAXN];//gap[x]=y :说明残留网络中dep[i]==x的个数为y int n;//n是总的点的个数,包括源点和汇点 void init()
{
tol = ;
memset(head, -, sizeof(head));
} void addedge(int u, int v, int w)
{
edge[tol].from = u;
edge[tol].to = v;
edge[tol].cap = w;
edge[tol].next = head[u];
head[u] = tol++;
edge[tol].from = v;
edge[tol].to = u;
edge[tol].cap = ;
edge[tol].next = head[v];
head[v] = tol++;
}
void BFS(int start, int end)
{
memset(dep, -, sizeof(dep));
memset(gap, , sizeof(gap));
gap[] = ;
int que[MAXN];
int front, rear;
front = rear = ;
dep[end] = ;
que[rear++] = end;
while (front != rear)
{
int u = que[front++];
if (front == MAXN)
{
front = ;
}
for (int i = head[u]; i != -; i = edge[i].next)
{
int v = edge[i].to;
if (dep[v] != -)
{
continue;
}
que[rear++] = v;
if (rear == MAXN)
{
rear = ;
}
dep[v] = dep[u] + ;
++gap[dep[v]];
}
}
}
int SAP(int start, int end)
{
int res = ;
BFS(start, end);
int cur[MAXN];
int S[MAXN];
int top = ;
memcpy(cur, head, sizeof(head));
int u = start;
int i;
while (dep[start] < n)
{
if (u == end)
{
int temp = INF;
int inser;
for (i = ; i < top; i++)
if (temp > edge[S[i]].cap)
{
temp = edge[S[i]].cap;
inser = i;
}
for (i = ; i < top; i++)
{
edge[S[i]].cap -= temp;
edge[S[i] ^ ].cap += temp;
}
res += temp;
top = inser;
u = edge[S[top]].from;
}
if (u != end && gap[dep[u] - ] == ) //出现断层,无增广路
{
break;
}
for (i = cur[u]; i != -; i = edge[i].next)
if (edge[i].cap != && dep[u] == dep[edge[i].to] + )
{
break;
}
if (i != -)
{
cur[u] = i;
S[top++] = i;
u = edge[i].to;
}
else
{
int min = n;
for (i = head[u]; i != -; i = edge[i].next)
{
if (edge[i].cap == )
{
continue;
}
if (min > dep[edge[i].to])
{
min = dep[edge[i].to];
cur[u] = i;
}
}
--gap[dep[u]];
dep[u] = min + ;
++gap[dep[u]];
if (u != start)
{
u = edge[S[--top]].from;
}
}
}
return res;
} int main()
{
// freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
int start, end;
int m;
int u, v, z;
int T;
while (~scanf("%d%d", &m, &n))
{
init();
while (m--)
{
scanf("%d%d%d", &u, &v, &z);
addedge(u, v, z);
//addedge(v, u, z);
}
//n一定是点的总数,这是使用SAP模板需要注意的
int ans = SAP(, n);
printf("%d\n", ans);
}
return ;
}
hdu 4280 给你岛的坐标求最西边到最东边的最大流
/*
最大流模板
sap
*/
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std; const int MAXN=;//点数的最大值
const int MAXM=;//边数的最大值
const int INF=0x3f3f3f3f; struct Node
{
int from,to,next;
int cap;
}edge[MAXM];
int tol;
int head[MAXN];
int dep[MAXN];
int gap[MAXN];//gap[x]=y :说明残留网络中dep[i]==x的个数为y int n;//n是总的点的个数,包括源点和汇点 void init()
{
tol=;
memset(head,-,sizeof(head));
} void addedge(int u,int v,int w)
{
edge[tol].from=u;
edge[tol].to=v;
edge[tol].cap=w;
edge[tol].next=head[u];
head[u]=tol++;
edge[tol].from=v;
edge[tol].to=u;
edge[tol].cap=;
edge[tol].next=head[v];
head[v]=tol++;
}
void BFS(int start,int end)
{
memset(dep,-,sizeof(dep));
memset(gap,,sizeof(gap));
gap[]=;
int que[MAXN];
int front,rear;
front=rear=;
dep[end]=;
que[rear++]=end;
while(front!=rear)
{
int u=que[front++];
if(front==MAXN)front=;
for(int i=head[u];i!=-;i=edge[i].next)
{
int v=edge[i].to;
if(dep[v]!=-)continue;
que[rear++]=v;
if(rear==MAXN)rear=;
dep[v]=dep[u]+;
++gap[dep[v]];
}
}
}
int SAP(int start,int end)
{
int res=;
BFS(start,end);
int cur[MAXN];
int S[MAXN];
int top=;
memcpy(cur,head,sizeof(head));
int u=start;
int i;
while(dep[start]<n)
{
if(u==end)
{
int temp=INF;
int inser;
for(i=;i<top;i++)
if(temp>edge[S[i]].cap)
{
temp=edge[S[i]].cap;
inser=i;
}
for(i=;i<top;i++)
{
edge[S[i]].cap-=temp;
edge[S[i]^].cap+=temp;
}
res+=temp;
top=inser;
u=edge[S[top]].from;
}
if(u!=end&&gap[dep[u]-]==)//出现断层,无增广路
break;
for(i=cur[u];i!=-;i=edge[i].next)
if(edge[i].cap!=&&dep[u]==dep[edge[i].to]+)
break;
if(i!=-)
{
cur[u]=i;
S[top++]=i;
u=edge[i].to;
}
else
{
int min=n;
for(i=head[u];i!=-;i=edge[i].next)
{
if(edge[i].cap==)continue;
if(min>dep[edge[i].to])
{
min=dep[edge[i].to];
cur[u]=i;
}
}
--gap[dep[u]];
dep[u]=min+;
++gap[dep[u]];
if(u!=start)u=edge[S[--top]].from;
}
}
return res;
} int main()
{
// freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
int start,end;
int m;
int u,v,z;
int T;
scanf("%d",&T); while(T--)
{
init();
scanf("%d%d",&n,&m);
int minx=;
int maxx=-;
int x,y;
for(int i=;i<=n;i++)
{
scanf("%d%d",&x,&y);
if(minx>x)
{
minx=x;
start=i;
}
if(maxx<x)
{
maxx=x;
end=i;
}
} while(m--)
{
scanf("%d%d%d",&u,&v,&z);
addedge(u,v,z);
addedge(v,u,z);
}
//n一定是点的总数,这是使用SAP模板需要注意的
int ans=SAP(start,end);
printf("%d\n",ans);
}
return ;
}
网络流 最大流SAPkuangbin模板的更多相关文章
- 网络流--最大流dinic模板
标准的大白书式模板,除了变量名并不一样……在主函数中只需要用到 init 函数.add 函数以及 mf 函数 #include<stdio.h> //差不多要加这么些头文件 #includ ...
- 网络流--最大流ek模板
标准大白书式模板,代码简单但由于效率并不高,所以并不常用,就是这样 #include<stdio.h> #include<string.h> #include<queue ...
- 网络流-最大流 Dinic模板
#include <bits/stdc++.h> using namespace std; #define MP make_pair #define PB push_back #defin ...
- 网络流--最大流--Dinic模板矩阵版(当前弧优化+非当前弧优化)
//非当前弧优化版 #include <iostream> #include <cstdio> #include <math.h> #include <cst ...
- 网络流--最大流--EK模板
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...
- (通俗易懂小白入门)网络流最大流——EK算法
网络流 网络流是模仿水流解决生活中类似问题的一种方法策略,来看这么一个问题,有一个自来水厂S,它要向目标T提供水量,从S出发有不确定数量和方向的水管,它可能直接到达T或者经过更多的节点的中转,目前确定 ...
- HDU1532 网络流最大流【EK算法】(模板题)
<题目链接> 题目大意: 一个农夫他家的农田每次下雨都会被淹,所以这个农夫就修建了排水系统,还聪明的给每个排水管道设置了最大流量:首先输入两个数n,m ;n为排水管道的数量,m为节点的数量 ...
- [POJ1273][USACO4.2]Drainage Ditches (网络流最大流)
题意 网络流最大流模板 思路 EK也不会超时 所以说是一个数据比较水的模板题 但是POJ有点坑,多组数据,而且题目没给 哭得我AC率直掉 代码 用的朴素Dinic #include<cstdio ...
- [讲解]网络流最大流dinic算法
网络流最大流算法dinic ps:本文章不适合萌新,我写这个主要是为了复习一些细节,概念介绍比较模糊,建议多刷题去理解 例题:codevs草地排水,方格取数 [抒情一下] 虽然老师说这个多半不考,但是 ...
随机推荐
- Ubuntu 12.04输入密码登陆后又跳回到登录界面
先找到这个文件: /home/user/.xsession-errors 打开这个文件. 这个文件记录了系统启动的日志,从这里你就可以看到启动的时候哪里出了问题. 对于我的来说,问题出在这里: & ...
- JSP 不能解析EL表达式的解决办法
原文地址:http://www.jb51.net/article/30791.htm 原因是:在默认情况下,Servlet 2.4 / JSP 2.0支持 EL 表达式. 解决的办法有两种: 1.修改 ...
- Eigen中的矩阵及向量运算
Eigen中的矩阵及向量运算 ,[+,+=,-,-=] ,[\*,\*=] ,[.transpose()] ,[.dot(),.cross(),.adjoint()] ,针对矩阵元素进行的操作[.su ...
- 阶段3 1.Mybatis_01.Mybatis课程介绍及环境搭建_07.环境搭建的注意事项
2 resources下面创建目录要一级一级的创建,下面这个创建的就是一级目录而不是三级 在文件夹下看到的目录也是一级的 因此这里创建目录需要一个个的去创建 配置文件和dao类这两个目录要保持一致,这 ...
- 5.2.k8s.Secret
#Secret Secret存储密码.token.密钥等敏感数据 Secret以Volume或环境变量方式使用 #Secret类型 Opaque : base64 编码格式的 Secret kuber ...
- 中国MOOC_零基础学Java语言_期末考试的编程题_1二进制的前导的零
期末考试的编程题 返回 这是期末考试的编程题,在60分钟内,你可以多次提交,直到正确为止. 温馨提示: 1.本次考试属于Online Judge题目,提交后由系统即时判分. 2.学生可以在考试截止 ...
- frewalld假端口
之前服务器没有开启firewalld,上面有lnmp.zabbix服务,后来开启了防火墙,发现端口都在,但是不能访问zabbix,后来用firewalld把端口重新开启.重新加载后才可以访问,这就是f ...
- 【Bean】标签常用属性
[Bean]标签常用属性 Id 说明:起名称,id属性值名称任意,不能包含特殊符号,根据id得到配置对象. Class 说明:创建对象所在类的全路径. Name 说明:功能和id是一样的,id属性值不 ...
- 前端使用Git 切换分支 查看线上远程,本地切换
想要使用Git切换线上分支时先 得先查看线上分支 git branch -a //查看线上分支 git branch //查看本地分支 这是线上的分支图(当前是master) 知道有那些分支就可以进行 ...
- yum 下载rpm包 安装rpm包依赖关系
方法一:yumdownloader 工具 1.安装工具包 yum install yum-utils -y 2.下载一个RPM包 yumdownloader <package-name> ...