POJ 1273
给出M条边,N个点,求源点1到汇点N的最大流量。

本文主要就是附上dinic的模板,供以后参考。

#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <queue>
#include <string.h> /*
POJ 1273
dinic算法模板 边是有向的,而且存在重边,且这里重边不是取MAX,而是累加和
*/
using namespace std;
const int INF=0x3f3f3f3f;
const int maxn=;
int pri[maxn];
long long sum; //计算总流量
int s,t; //s:源点 t:汇点
int n,m; struct Edge{
int c,f;
}maps[maxn][maxn]; int min(int a,int b){
return a<b?a:b;
}
//每次先BFS,看看是否存在从源点到汇点的增广路
bool BFS() {
queue<int> q;
memset(pri,,sizeof(pri));
pri[]=;
q.push();
while(!q.empty()) {
int temp=q.front();
q.pop();
for(int i=; i<=m; i++) {
if(!pri[i] && maps[temp][i].c-maps[temp][i].f){
pri[i]=pri[temp]+;
if(i==t)
return true; //即如果可以流到汇点,直接return true
q.push(i);
}
}
}
//if(pri[m]>0)
// return true;
return false;
} //p表示当前节点,flow表示该节点通过的流量
int dinic(int p,int flow){
if(p==t){
return flow;
}
int f=flow;
//int value=0;
for(int i=;i<=m;i++){
if(pri[i]==pri[p]+ && maps[p][i].c-maps[p][i].f){
int a=maps[p][i].c-maps[p][i].f; //a为该边可以增加的流量
int ff=dinic(i,min(a,flow)); //ff为路径中所有a的最小值,即为该条路中可以增加的流量
maps[p][i].f+=ff; //正向边
maps[i][p].f-=ff; //逆向边
//value+=ff;
flow-=ff;
if(flow<=)
break; //优化剪枝
}
}
//return value;
if(f-flow<=)
pri[p]=;//如果从p点流出去的流量<=0,那么设置pri[p]的值为0,之后在dinic中就不考虑到p点的情况了。
return f-flow;
}
void init(){
for(int i=;i<=m;i++){
for(int j=;j<=m;j++){
maps[i][j].c=maps[i][j].f=;
}
}
}
int main() {
int a,b,c;
s=;
while(scanf("%d%d",&n,&m)!=EOF){
init();
//memset(maps,0,sizeof(maps));
sum=;
t=m;
for(int i=;i<=n;i++){
scanf("%d%d%d",&a,&b,&c);
maps[a][b].c+=c; //该题有重边,这里要+=,不是去max
}
while(BFS()){
sum+=dinic(s,INF);
}
printf("%I64d\n",sum);
}
return ;
}

再给出一个大牛的模板:

#include <cstdio>
#include <queue> using namespace std; typedef int LL;
const int N = ;
const int M = N << ;
const int INF = (int)1e9; struct Dinic { struct Edge {
int v;
LL cap, flow;
Edge* next, * pair; void init(int a, LL b, Edge* e1, Edge* e2) {
v = a, cap = b, flow = , next = e1, pair = e2;
}
}; Edge* head[N], * used[N];
Edge* it;
int lev[N], que[N];
Edge E[M];
int n, s, t;
LL maxFlow; void init(int n, int s, int t) {
it = E;
this->n = n;
this->s = s, this->t = t;
for (int i = ; i < n; i++)
head[i] = ;
} void add(int u, int v, LL c) {
it->init(v, c, head[u], it + );
head[u] = it++;
it->init(u, , head[v], it - );
head[v] = it++;
} bool bfs() {
for (int i = ; i < n; lev[i++] = -);
lev[s] = ;
int st = , ed = ;
que[ed++] = s;
while (st < ed) {
int u = que[st++];
for (Edge* e = head[u]; e; e = e->next) {
int v = e->v;
if (lev[v] == - && e->cap > e->flow) {
lev[v] = lev[u] + ;
que[ed++] = v;
}
}
}
return lev[t] != -;
} LL dfs(int u, LL f) {
if (u == t) return f;
for (Edge* & e = used[u]; e; e = e->next) {
int v = e->v;
if (e->cap > e->flow && lev[v] == lev[u] + ) {
LL tmp = dfs(v, min(e->cap - e->flow, f));
if (tmp > ) {
e->flow += tmp;
e->pair->flow -= tmp;
return tmp;
}
}
}
return ;
} void run() {
maxFlow = ;
while (bfs()) {
for (int i = ; i < n; i++)
used[i] = head[i];
LL f = ;
while (f) {
f = dfs(s, INF);
maxFlow += f;
}
}
} }G; int main() {
int n, m, u, v, w;
while (~scanf("%d%d", &m, &n)) {
G.init(n, , n - );
while (m--) {
scanf("%d%d%d", &u, &v, &w);
G.add(u - , v - , w);
}
G.run();
printf("%d\n", G.maxFlow);
}
return ;
}

POJ 1273 Drainage Ditches(网络流dinic算法模板)的更多相关文章

  1. POJ 1273 Drainage Ditches (网络流Dinic模板)

    Description Every time it rains on Farmer John's fields, a pond forms over Bessie's favorite clover ...

  2. poj 1273 Drainage Ditches 网络流最大流基础

    Drainage Ditches Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 59176   Accepted: 2272 ...

  3. POJ 1273 Drainage Ditches 网络流 FF

    Drainage Ditches Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 74480   Accepted: 2895 ...

  4. poj 1273 Drainage Ditches (网络流 最大流)

    网络流模板题. ============================================================================================ ...

  5. poj 1273 Drainage Ditches(最大流)

    http://poj.org/problem?id=1273 Drainage Ditches Time Limit: 1000MS   Memory Limit: 10000K Total Subm ...

  6. POJ 1273 Drainage Ditches

    Drainage Ditches Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 67387   Accepted: 2603 ...

  7. POJ 1273 Drainage Ditches (网络最大流)

    http://poj.org/problem? id=1273 Drainage Ditches Time Limit: 1000MS   Memory Limit: 10000K Total Sub ...

  8. POJ 1273 - Drainage Ditches - [最大流模板题] - [EK算法模板][Dinic算法模板 - 邻接表型]

    题目链接:http://poj.org/problem?id=1273 Time Limit: 1000MS Memory Limit: 10000K Description Every time i ...

  9. 网络流最经典的入门题 各种网络流算法都能AC。 poj 1273 Drainage Ditches

    Drainage Ditches 题目抽象:给你m条边u,v,c.   n个定点,源点1,汇点n.求最大流.  最好的入门题,各种算法都可以拿来练习 (1):  一般增广路算法  ford() #in ...

随机推荐

  1. lib和dll的区别,生成(转)

    首先介绍下静态库(静态链接库,.lib文件),动态库*(动态链接库,.dll文件)的概念,首先两者都是代码共享的方式. 静态库:在链接步骤中,连接器将从库文件取得所需的代码,复制到生成的可执行文件,这 ...

  2. Mysql账号管理

    一 用户添加 通过insert 方式添加用户 insert into mysql.user(Host,User,Password) values("localhost"," ...

  3. RMAN - "丢失控制文件的恢复"

    OS: Oracle Linux Server release 5.7 DB: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - ...

  4. android开发系列之多线程

    今天在这篇博客里面,我只想谈谈自己对程序开发里面避无可避的一个问题-多线程的一些看法与思考. 其实说到多线程这个名称相信只要接触过软件这个行业的人都已经耳熟能详了,但是如果被问到到底什么才是多线程呢? ...

  5. iOS-添加测试设备Identifier

    第一步:确认你的设备已经连接 第二步:点击xcode上"Windows"标签,选择"Devices" 第三步:在弹出的左框选择你要添加的设备.在右边框里可以找到 ...

  6. mvvm 模式

    MVC = Massive View Controller ? 有笑话称MVC为重量级的试图控制器.仔细一想,确实存在这个问题.以UITableViewController和UITableView举个 ...

  7. IOS之表视图添加搜索栏

    下面是我们要实现的效果.本效果是在上一篇自定义表视图的基础上进行更改的.     1.将Search bar and search display拖动到ViewController中.不要添加Sear ...

  8. Spark 3000门徒第一课随笔

    昨晚听了王家林老师的Spark 3000门徒系列课程的第一课,把scala基础过了一遍,对ArrayBuffer有了新的认识: Array本身创建后不可修改ArrayBuffer可修改import s ...

  9. 解决vs2013不能添加控制器的步骤

    点击:vs2013 更新,更新完以后,再重启下电脑就可以正常使用了

  10. Rstdio中更换R版本

    1.打开Rstdio,选择Tool --> Global Options.