还是不是很懂算法

先存一个模板先吧~~~

看的这篇学的--

http://www.renfei.org/blog/isap.html

 #include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std; const int maxn = ;
const int INF = ( << ) - ; struct Edge{
int from,to,cap,flow;
}; vector<Edge> edges; int source; // 源点
int sink; // 汇点
int p[maxn]; // 可增广路上的上一条弧的编号
int num[maxn]; // 和 t 的最短距离等于 i 的节点数量
int cur[maxn]; // 当前弧下标
int d[maxn]; // 残量网络中节点 i 到汇点 t 的最短距离
bool visited[maxn]; int num_nodes; vector<int> G[maxn]; // 预处理, 反向 BFS 构造 d 数组
bool bfs()
{
memset(visited, , sizeof(visited));
queue<int> Q;
Q.push(sink);
visited[sink] = ;
d[sink] = ;
while (!Q.empty()) {
int u = Q.front();
Q.pop();
for ( int i = ;i < G[u].size();i++) {
Edge &e = edges[G[u][i]^];
if (!visited[e.from] && e.cap> e.flow) {
visited[e.from] = true;
d[e.from] = d[u] + ;
Q.push(e.from);
}
}
}
return visited[source];
} // 增广
int augment()
{
int u = sink, df = INF;
// 从汇点到源点通过 p 追踪增广路径, df 为一路上最小的残量
while (u != source) {
Edge &e = edges[p[u]];
df = min(df, e.cap - e.flow);
u = edges[p[u]].from;
}
u = sink;
// 从汇点到源点更新流量
while (u != source) {
edges[p[u]].flow += df;
edges[p[u]^].flow -= df;
u = edges[p[u]].from;
}
return df;
} int max_flow()
{
int flow = ;
bfs();
memset(num, , sizeof(num));
for (int i = ; i < num_nodes; i++) num[d[i]]++;
int u = source;
memset(cur, , sizeof(cur));
while (d[source] < num_nodes) {
if (u == sink) {
flow += augment();
u = source;
}
bool advanced = false;
for (int i = cur[u]; i < G[u].size(); i++) {
Edge& e = edges[G[u][i]];
if (e.cap > e.flow && d[u] == d[e.to] + ) {
advanced = true;
p[e.to] = G[u][i];
cur[u] = i;
u = e.to;
break;
}
}
if (!advanced) { // retreat
int m = num_nodes - ;
for ( int i = ;i < G[u].size();i++)
if (edges[G[u][i]].cap > edges[G[u][i]].flow)
m = min(m, d[edges[G[u][i]].to]);
if (--num[d[u]] == ) break; // gap 优化
num[d[u] = m+]++;
cur[u] = ;
if (u != source)
u = edges[p[u]].from;
}
}
return flow;
} void addedges(int from,int to,int cap){
edges.push_back((Edge){from,to,cap,});
edges.push_back((Edge){to,from,,});
int m = edges.size();
G[from].push_back(m-);
G[to].push_back(m-);
} void init(){
edges.clear();
for(int i = ;i < num_nodes;i++) G[i].clear();
} int main(){
int m;
while(scanf("%d %d ",&m,&num_nodes) != EOF){
init();
source = ; sink = num_nodes-;
for(int i = ;i < m;i++){
int u,v,c;
scanf("%d %d %d",&u,&v,&c);u--;v--;
addedges(u,v,c);
}
int res = max_flow();
printf("%d\n",res);
}
return ;
}

再存一个dinic的吧~~~

 #include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <map>
#include <set>
#include <stack>
#include <queue>
#include <iostream>
#include <algorithm>
using namespace std;
#define lp (p << 1)
#define rp (p << 1|1)
#define getmid(l,r) (l + (r - l) / 2)
#define MP(a,b) make_pair(a,b)
typedef long long ll;
typedef unsigned long long ull;
const int INF = << ;
const int maxn = ; int c[maxn][maxn],n,m,lev[maxn];
int st,ed; void Bfs(){
memset(lev,-,sizeof(lev));
queue<int> Q;
while(!Q.empty()) Q.pop();
Q.push(st);
lev[st] = ;
while(!Q.empty()){
int x = Q.front();Q.pop();
for(int i = ; i <= ed; ++i) if(lev[i] < && c[x][i] > ){
lev[i] = lev[x] + ;
Q.push(i);
}
}
} int Dfs(int p,int minc){
if(p == ed) return minc;
for(int i = ; i <= ed; ++i) if(lev[i] > lev[p] && c[p][i] > ){
int d = Dfs(i,min(c[p][i],minc));
if(d > ){
c[p][i] -= d;
c[i][p] += d;
return d;
}
}
return ;
} int Dinic(){
int max_flow = ,plus;
while(){
Bfs();
if(lev[ed] < ) break;
while((plus = Dfs(,INF)) > ) max_flow += plus;
}
return max_flow;
} int main(){
while(scanf("%d %d",&m,&n) != EOF){
st = ;ed = n;
memset(c,,sizeof(c));
for(int i = ;i <= m;i++){
int u,v,w;
scanf("%d %d %d",&u,&v,&w);
c[u][v] += w;
}
printf("%d\n",Dinic());
}
return ;
}

hdu 1532 Drainage Ditches 【ISAP 】的更多相关文章

  1. hdoj 1532 Drainage Ditches【最大流模板题】

    Drainage Ditches Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  2. poj 1273 && hdu 1532 Drainage Ditches (网络最大流)

    Drainage Ditches Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 53640   Accepted: 2044 ...

  3. HDU 1532 Drainage Ditches (网络流)

    A - Drainage Ditches Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64 ...

  4. POJ_1273 Drainage Ditches 【网络流】

    一.题面 Drainage Ditches 二.分析 网络流的裸题. 1 Edmonds-Karp算法 求解网络流其实就是一个不断找增广路,然后每次找到一条增广路后更新残余网络的一个过程. EK算法主 ...

  5. HDU 1532 Drainage Ditches 分类: Brush Mode 2014-07-31 10:38 82人阅读 评论(0) 收藏

    Drainage Ditches Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  6. POJ 1273 || HDU 1532 Drainage Ditches (最大流模型)

    Drainage DitchesHal Burch Time Limit 1000 ms Memory Limit 65536 kb description Every time it rains o ...

  7. HDU1532 Drainage Ditches 【最大流量】

    Drainage Ditches Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  8. HDU 1532 Drainage Ditches (最大网络流)

    Drainage Ditches Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) To ...

  9. hdu 1532 Drainage Ditches(最大流)

                                                                                            Drainage Dit ...

随机推荐

  1. print输出带颜色的方法详解

    书写格式:     开头部分:\033[显示方式;前景色;背景色m + 结尾部分:\033[0m      注意:开头部分的三个参数:显示方式,前景色,背景色是可选参数,可以只写其中的某一个:另外由于 ...

  2. Day 08 字符编码

    字符编码 计算机基础 启动应用程序 1.双击QQ 2.操作系统接受指定然后把该操作转化为0和1发送给CPU 3.CPU接受指令然后把指令发给内存 4.内存接受指令把指令发送给硬盘获取数据 5.QQ在内 ...

  3. N3-1 - 数组 - convert-sorted-array-to-binary-search-tree

    题目描述: Given an array where elements are sorted in ascending order, convert it to a height balanced B ...

  4. 配置sudo命令行为审计

    1.检查是否安装 rpm -aq sudo rsyslog #检验是否安装此软件 ***如果没有需执行(yum install sudo rsyslog -y)安装*** 2.配置审计 echo &q ...

  5. Python学习笔记(3)for循环和while循环

    2019-02-25 (1)break语句:终止当前循环,跳出循环体. (2)continue语句:终止本轮循环并开始下一轮循环(在下一轮循环开始前,会先测试循环条件). (3)for循环 ① ran ...

  6. Tensorflow读取文件到队列文件

    TensorFlow读取二进制文件数据到队列 2016-11-03 09:30:00      0个评论    来源:diligent_321的博客   收藏   我要投稿 TensorFlow是一种 ...

  7. Java基础学习总结(35)——Java正则表达式详解

    在Sun的Java JDK 1.40版本中,Java自带了支持正则表达式的包,本文就抛砖引玉地介绍了如何使用java.util.regex包. 可粗略估计一下,除了偶尔用Linux的外,其他Linu  ...

  8. CodeForcesGym 100676G Training Camp

    G. Training Camp Time Limit: 1000ms Memory Limit: 262144KB This problem will be judged on CodeForces ...

  9. Apache 做反向代理服务器

    apache做反向代理服务器 apache代理分为正向代理和反向代理: 1 正向代理: 客户端无法直接访问外部的web,需要在客户端所在的网络内架设一台代理服务器,客户端通过代理服务器访问外部的web ...

  10. redis代码解析-事务

    redis 的事务相关的几个命令分别为 watch multi exec. watch 可以监控一个变量在事务开始执行之前是否有被修改.使用方式为: WATCH key [key ...] 在redi ...