网络流最经典的入门题 各种网络流算法都能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 ...
随机推荐
- LINQ标准查询操作符(五)
十二.相等操作符 如果两个序列的对应元素相等且这两个序列具有相同数量的元素,则视这两个序列相等. SequenceEqual方法通过并行地枚举两个数据源并比较相应元素来判断两个序列是否相等.如果两个序 ...
- 第二百三十天 how can I 坚持
上周日去蟒山摘的松子吗?应该是松子吧,裂开了呢.为啥呢.原来博客园可以上传图片,只是上传起来好费劲啊. 今天程哥问给我分的活多不多,我竟然说了句好多,哎.其实很多问题可以用还好来回答,还好,还行,哈哈 ...
- LightOJ 13361336 - Sigma Function (找规律 + 唯一分解定理)
http://lightoj.com/volume_showproblem.php?problem=1336 Sigma Function Time Limit:2000MS Memory L ...
- 成功获取并更改中兴F660光猫的超级用户密码解除四台限制
上次雷雨后更换的中兴的F660光猫还是很不错的,很稳定,不过超级密码确实记不住,找了些资料,今天成功的更改了密码,简要的写出过程以备下次参考: 第一步:获取超级密码(已知用户名telecomadmin ...
- mysql kill操作
KILL语法 KILL [CONNECTION | QUERY] thread_id 每个与mysqld的连接都在一个独立的线程里运行,您可以使用SHOW PROCESSLIST语句查看哪些线程正在运 ...
- MSSQL手札三 MSSQL存储过程
--存储过程完成一段sql代码的封装 create proc trim --参数列表,多个间用逗号分隔 ) as --自定义代码段 ) set @str1=LTRIM(RTRIM(@str)) pri ...
- react native listview 一个有用的属性,用作两列布局
contentContainerStyle:设置listview包裹内容的属性 <ListView contentContainerStyle={{flexDirection:'row',fle ...
- linux中less命令使用
less与cat和more的区别: cat命令功能用于显示整个文件的内容单独使用没有翻页功能因此经常和more命令搭配使用,cat命令还有就是将数个文件合并成一个文件的功能. more命令功能:让画面 ...
- 国内外从事CV相关的企业[转]
提示:本文为笔者原创,转载请注明出处:blog.csdn.net/carson2005 经常碰到朋友问我国内从事计算机视觉(CV)领域的公司的发展情况,产品情况,甚至找工作等问题,这里,我给出自己收集 ...
- Freescale OSBDM JM60仿真器
OSBDM-JM60 - 9S08JM60 Based OSBDM — It includes interfaces and firmware applied to all the targets s ...