网络流最经典的入门题 各种网络流算法都能AC。 poj 1273 Drainage Ditches
题目抽象:给你m条边u,v,c。 n个定点,源点1,汇点n.求最大流。 最好的入门题,各种算法都可以拿来练习
(1): 一般增广路算法 ford()
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <sstream>
#include <iomanip>
using namespace std;
typedef long long LL;
const int INF = 0x4fffffff;
const double EXP = 1e-;
const int MS = ;
const int SIZE = ; struct edge
{
int c, f;
}edges[MS][MS]; int n, m; int flag[MS];
int pre[MS];
int alpha[MS]; int que[SIZE]; int u;
int qs, qe;
int i, j; void ford()
{
while ()
{
// label method
memset(flag, 0xff, sizeof(flag));
memset(pre, 0xff, sizeof(pre));
memset(alpha, 0xff, sizeof(alpha));
flag[] = ;
pre[] = ;
alpha[] = INF;
qs = qe = ;
que[qe++] = ; while (qs < qe&&flag[n ] == -)
{
u = que[qs++];
for (int i = ; i <= n; i++)
{
if (flag[i] == -)
{
if (edges[u][i].c >&&edges[u][i].f < edges[u][i].c)
{
flag[i] = ; pre[i] = u;
alpha[i] = min(alpha[u], edges[u][i].c - edges[u][i].f);
que[qe++] = i;
}
else if (edges[i][u].c>&&edges[i][u].f>)
{
flag[i] = ; pre[i] = -u;
alpha[i] = min(alpha[u], edges[i][u].f);
que[qe++] = i;
}
}
}
flag[u] = ;
} // END OF WHILE
if (flag[n ] == - || alpha[n ] == )
break; // END OF WHILE int k1 = n , k2 = abs(pre[k1]);
int a = alpha[n ];
while ()
{
if (edges[k2][k1].c>) //用f是否==INF来判断正向
edges[k2][k1].f += a;
else
edges[k1][k2].f -= a;
if (k2 == )
break;
k1 = k2;
k2 = abs(pre[k1]);
} // END OF WHILE
} // END OF WHILE int max_flow = ;
for (int i = ; i <=n; i++)
{
for (int j = ; j <=n; j++)
{
if (i == && edges[i][j].f >)
max_flow += edges[i][j].f;
// if (edges[i][j].f > 0)
// printf("%d-->%d: %d\n", i, j, edges[i][j].f);
}
}
printf("%d\n", max_flow);
} int main()
{
int u, v, c, f;
while(scanf("%d%d",&m,&n)!=EOF)
{
for (int i = ; i <= n; i++)
for (int j = ; j <= n; j++)
// edges[i][j].c = edges[i][j].f = INF;
edges[i][j].c=edges[i][j].f=;
for (int i = ; i < m; i++)
{
//scanf("%d%d%d%d", &u, &v, &c, &f);
scanf("%d%d%d",&u,&v,&c); // 这里是零流
edges[u][v].c +=c; // 可能有重边
// edges[u][v].f = f;
}
ford();
}
return ;
}
(2): dinic()
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <string>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <list>
#include <iomanip>
#include <cstdlib>
#include <sstream>
using namespace std;
typedef long long LL;
const int INF=0x5fffffff;
const double EXP=1e-;
const int MS=; int edges[MS][MS];
int level[MS];
int que[MS],qs,qe;
int n,m,ans; int BFS() // BFS求level
{
memset(level,0xff,sizeof(level));
level[]=;
qs=qe=;
que[qe++]=;
while(qs<qe)
{
int u=que[qs++];
for(int v=;v<=n;v++)
{
if(level[v]<&&edges[u][v]>)
{
level[v]=level[u]+;
que[qe++]=v;
}
}
}
if(level[n]>) // 汇点在残留网络中,存在增广路
return ;
else
return ;
} int DFS(int u,int minv)
{
if(u==n)
return minv;
int t;
for(int v=;v<=n;v++)
if(edges[u][v]>&&level[v]==level[u]+&&(t=DFS(v,min(minv,edges[u][v]))))
{
edges[u][v]-=t;
edges[v][u]+=t;
return t;
}
return ;
} int main()
{
int u,v,c;
while(scanf("%d%d",&m,&n)!=EOF)
{
memset(edges,,sizeof(edges));
for(int i=;i<=m;i++)
{
scanf("%d%d%d",&u,&v,&c);
edges[u][v]+=c;
}
ans=;
int t;
// DINIC()
while(BFS()) //还存在增广路
{
while(t=DFS(,INF)) //DFS找出残留网络中的所有增广路
{
ans+=t;
}
}
printf("%d\n",ans);
}
return ;
}
网络流最经典的入门题 各种网络流算法都能AC。 poj 1273 Drainage Ditches的更多相关文章
- POJ 1273 Drainage Ditches(网络流,最大流)
Description Every time it rains on Farmer John's fields, a pond forms over Bessie's favorite clover ...
- POJ 1273 Drainage Ditches【图论,网络流】
就是普通的网络流问题,想试试新学的dinic算法,这个算法暑假就开始看国家集训队论文了,之前一直都只用没效率的EK算法,真正学会这个算法还是开学后白书上的描述:dinic算法就是不断用BFS构建层次图 ...
- POJ 1273 Drainage Ditches (网络流Dinic模板)
Description Every time it rains on Farmer John's fields, a pond forms over Bessie's favorite clover ...
- POJ 1273 Drainage Ditches(网络流dinic算法模板)
POJ 1273给出M条边,N个点,求源点1到汇点N的最大流量. 本文主要就是附上dinic的模板,供以后参考. #include <iostream> #include <stdi ...
- 网络流--最大流--POJ 1273 Drainage Ditches
链接 Description Every time it rains on Farmer John's fields, a pond forms over Bessie's favorite clov ...
- POJ 1273 - Drainage Ditches - [最大流模板题] - [EK算法模板][Dinic算法模板 - 邻接表型]
题目链接:http://poj.org/problem?id=1273 Time Limit: 1000MS Memory Limit: 10000K Description Every time i ...
- poj 1273 Drainage Ditches (网络流 最大流)
网络流模板题. ============================================================================================ ...
- poj 1273 Drainage Ditches 最大流入门题
题目链接:http://poj.org/problem?id=1273 Every time it rains on Farmer John's fields, a pond forms over B ...
- POJ 1273 Drainage Ditches 网络流 FF
Drainage Ditches Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 74480 Accepted: 2895 ...
随机推荐
- Linux操作系统时间与BIOS硬件时间
注:以Ubuntu为例说明 在Linux计算机上,有两个时间,一个是硬件时间(BIOS中记录的时间,称为hwclock),另一个是操作系统时间(osclock).硬件时钟由BIOS电池供电, 当计算机 ...
- SQL获取变量类型以及变量最大长度
DECLARE @Temp nvarchar(1050)='' SELECT CAST(SQL_VARIANT_PROPERTY(@Temp, 'BaseType') AS VARCHAR(50))S ...
- POJ 1556 The Doors(线段交+最短路)
The Doors Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 5210 Accepted: 2124 Descrip ...
- <<海闻电子发票接口 ESB 封装 代码指示 文档>>
<<海闻电子发票接口 ESB 封装 代码指示 文档>> isValid 是否有效标志 代码 中文 说明 true 成功 false 失败 code 海闻错误说明 代码 中文 ...
- HDU 5703 Desert (找规律)
题意:一杯水有n的容量,问有多少种方法可以喝完. 析:找规律,找出前几个就发现规律了,就是2的多少次幂. 代码如下: #include <cstdio> #include <stri ...
- http://docwiki.embarcadero.com/RADStudio/XE7/en/Delphi_Data_Types
http://docwiki.embarcadero.com/RADStudio/XE7/en/Delphi_Data_Types
- Web Service实现分布式服务的基本原理
简单的说, 就是客户端根据WSDL 生成 SOAP 的请求消息, 通过 HTTP 传输方式(也可以是其它传输方式, 如 FTP 或STMP 等,目前 HTTP 传输方式已经成为 J2EE Web Se ...
- Toast在关闭应用后还显示的解决办法
1.我们在用Toast的用法就是:Toast.makeText(Context,CharSequence , Duration).show().但有的时候如果你在一次操作当中多次点击一个view的时候 ...
- [转][IIS]发布网站,提示用户 'IIS APPPOOL\***' 登录失败。
链接:http://www.cnblogs.com/tianguook/p/3881075.html 用户 'IIS APPPOOL\DefaultAppPool' 登录失败. 我在windows8中 ...
- jqGrid初次使用遇到的问题及解决方法
问题一:初始化定义翻页用的导航栏时,表中出现"undefined"方框: 解决:需要导入grid.locale-cn.js文件. 问题二:页面只有一页,无法翻页: 解决:初始化设置 ...