网络流最经典的入门题 各种网络流算法都能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 ...
随机推荐
- HDU 5857 Median (推导)
Median 题目链接: http://acm.split.hdu.edu.cn/showproblem.php?pid=5857 Description There is a sorted sequ ...
- python 应用xml.dom.minidom读xml
xml文件 <?xml version="1.0" encoding="utf-8"?> <city> <name>上海&l ...
- STM32中的位带(bit-band)操作
转:http://blog.csdn.net/gaojinshan/article/details/11479929 //位带操作,实现51类似的GPIO控制功能 //具体实现思想,参考<< ...
- Java和MongoDB之Hello World
1.新建Project 新建Java Project,并把mongo-java-driver驱动加入到项目bulid path中,如果你使用的是maven增加依赖. <dependency> ...
- Web CORS 跨域方式使用方式
CORS 参考 http://enable-cors.org/index.html https://help.aliyun.com/document_detail/oss/practice/cors_ ...
- Java工具类 Apache Commons:commons-lang
Commons Lang The standard Java libraries fail to provide enough methods for manipulation of its core ...
- 你真的会玩SQL吗?实用函数方汇总
http://www.cnblogs.com/zhangs1986/p/4917800.html 实用函数方法 由于有些知识很少被用到,但真需要用时却忘记了又焦头烂额的到处找. 现在将这些‘冷门“却有 ...
- Python学习入门基础教程(learning Python)--5.1 Python下文件处理基本过程
Python下的文件读写操作过程和其他高级语言如C语言的操作过程基本一致,都要经历以下几个基本过程. 1. 打开文件 首先是要打开文件,打开文件的主要目的是为了建立程序和文件之间的联系.按程序访问文件 ...
- 利用css中的border生成三角,兼容包括IE6的主流浏览器
1.生成四个不同颜色方向的梯形 #ladder{ width:20px; height:20px; border:10px solid; border-color:#ff3300 #0000ff #3 ...
- Java练习之最大相同子串
package string.demo; /* 需求:找到两个字符串的最长共同子串 * 思路: * 1.先看短的那个字符串是否在长的那个字符串中,如果存在,短的那个字符串就是最大共同子串 * 2.如果 ...