qyy开始练习网络流啦 , 啊 ,蒟蒻只会套版 ,很裸的题 , 我连题都不想发了 ,可以参考我的代码(虽然我也是看的别人的

 #include <iostream>
#include <cstring>
#include <vector>
#include <cstdio>
#include <queue>
const int N = + , M = + ;
using namespace std ;
int n , m ;
int tot , head[N] ;
long long ans;
struct id
{
int to , nxt ;
long long val ;
} edge[M<<] ;
queue< int > Q;
int dis[N] ,cur[N]; inline void Init( )
{
freopen( "NSOOJ10477.in" , "r" , stdin ) ;
freopen( "NSOOJ10477.out" , "w" , stdout ) ;
} int read( )
{
char ch = getchar( ) ; int k = , ret = ;
while( ch > '' || ch < '' ) { if( ch == '-' ) k = - ; ch = getchar( ) ; }
while( ch <= '' && ch >= '' ) ret = ret * + ch - '' , ch = getchar( ) ;
return ret * k ;
} void add( int u , int v , int c )
{
edge[++tot].to = v , edge[tot].nxt = head[u] ;
edge[tot].val = c , head[u] = tot ;
} void input( )
{
n = read( ) , m = read( ) ;
memset( head , - , sizeof( head ) ) ;
tot = ;
for( int x = ; x <= m ; ++x )
{
int a, b , c ;
a = read( ) , b = read( ) , c = read( ) ;
add( a, b , c ) ;
add( b , a , ) ;
}
} bool bfs( )
{
memset( dis , - , sizeof(dis) ) ;
Q.push( ) ; dis[] = ;
while( !Q.empty( ) )
{
int u = Q.front( ) ; Q.pop( ) ;
for( int i = head[u] ; ~i ; i = edge[i].nxt )
{ int v = edge[i].to ;
if( dis[v] < && edge[i].val > )
{
dis[v] = dis[u] + ; Q.push( v ) ;
} }
}
// cout<<endl;
if( dis[n] > ) return true ;
return false ;
} long long int dfs( int u , int inf )
{
long long int ans = 0ll , cost = 0ll;
if( u == n ) return inf ;
for( int i = cur[u] ; ~i ; i = edge[i].nxt )
{
int v = edge[i].to ;
if( dis[v] != dis[u] + ) continue ;
ans = dfs( v , min( inf - cost , edge[i].val ) ) ;
edge[i].val -= ans ;
edge[i^].val += ans ;
if( edge[i].val ) cur[u] = i ;
cost += ans ;
if( cost == inf ) return inf ;
}
if( !cost ) dis[u] = - ;
return cost ;
} void sov( )
{
ans = ;
while( bfs( ) )
{
int now ;
for( int i = ; i <= n ; ++i ) cur[i] = head[i] ;
ans += dfs( , << ) ;
}
printf( "%lld" , ans ) ;
} int main( )
{
// Init( ) ;
input( ) ;
sov( ) ;
// fclose( stdin ) ;
// fclose( stdout ) ;
return ;
}

重新贴板,和上面的程序几乎没什么区别,码风固定了,值得开心。

 #include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
const int N = , M = 3e5 + , inf = << ;
using namespace std;
int n, m, head[N], cnt, dis[N],cur[N];
queue<int>Q;
struct edge
{
int nxt,to,vi;
} E[M<<]; void add(int u,int v,int vi)
{
E[++cnt] = (edge){head[u],v,vi}; head[u] = cnt;
E[++cnt] = (edge){head[v],u,}; head[v] = cnt;
} void Init()
{
scanf("%d%d",&n,&m); cnt = -;
int u,v,vi;
memset(head,-,sizeof(head));
for(int i = ; i <= m; ++i)
{
scanf("%d%d%d",&u,&v,&vi);
add(u,v,vi);
}
} bool bfs()
{
memset(dis,-,sizeof(dis));
Q.push(); dis[] = ;
while(!Q.empty())
{
int u = Q.front(); Q.pop();
for(int i = head[u]; ~i; i = E[i].nxt)
{
int v = E[i].to;
if(dis[v] == - && E[i].vi > ) dis[v] = dis[u] + , Q.push(v);
}
}
return (dis[n] > );
} int dfs(int u,int t,int ff)
{
int ret = , cost = ;
if(u == t) return ff;
for(int i = cur[u] ; ~i; i = E[i].nxt)
{
int v = E[i].to;
if(dis[v] != dis[u] + ) continue;
cost = dfs(v,t,min(ff-ret,E[i].vi));
E[i].vi -= cost, E[i^].vi += cost; ret += cost;
if(E[i].vi) cur[u] = i;
if(ret == ff) return ff;
}
if(!ret) dis[u] = -;
return ret;
} int max_flow(int s,int t)
{
int ret = ;
while(bfs())
{
for(int i = ; i <= n; ++i) cur[i] = head[i];
ret += dfs(s,t,inf);
}
return ret;
} void Solve()
{
int ans = max_flow(,n);
printf("%d\n",ans);
} int main()
{
Init();
Solve(); return ;
}

最大流加强 dinic+当前弧优化的更多相关文章

  1. ARC085E(最小割规划【最大流】,Dinic当前弧优化)

    #include<bits/stdc++.h>using namespace std;typedef long long ll;const ll inf=0x3f3f3f3f;int cn ...

  2. P3376 网络流-最大流模板题(Dinic+当前弧优化)

    (点击此处查看原题) Dinic算法 Dinic算法相对于EK算法,主要区别在于Dinic算法对图实现了分层,使得我们可以用一次bfs,一次dfs使得多条增广路得到增广 普通的Dinic算法已经可以处 ...

  3. [Poj2112][USACO2003 US OPEN] Optimal Milking [网络流,最大流][Dinic+当前弧优化]

    题意:有K个挤奶机编号1~K,有C只奶牛编号(K+1)~(C+K),每个挤奶机之多能挤M头牛,现在让奶牛走到挤奶机处,求奶牛所走的最长的一条边至少是多少. 题解:从起点向挤奶机连边,容量为M,从挤奶机 ...

  4. Dinic当前弧优化 模板及教程

    在阅读本文前,建议先自学最大流的Ek算法. 引入 Ek的核心是执行bfs,一旦找到增广路就停下来进行增广.换言之,执行一遍BFS执行一遍DFS,这使得效率大大降低.于是我们可以考虑优化. 核心思路 在 ...

  5. 网络最大流算法—Dinic算法及优化

    前置知识 网络最大流入门 前言 Dinic在信息学奥赛中是一种最常用的求网络最大流的算法. 它凭借着思路直观,代码难度小,性能优越等优势,深受广大oier青睐 思想 $Dinic$算法属于增广路算法. ...

  6. HDU 4280 Island Transport(dinic+当前弧优化)

    Island Transport Description In the vast waters far far away, there are many islands. People are liv ...

  7. 【Luogu】P1231教辅的组成(拆点+Dinic+当前弧优化)

    题目链接 妈耶 我的图建反了两次 准确的说是有两个地方建反了,然后反上加反改了一个小时…… 知道为什么要拆点吗? 假设这是你的图   左边到右边依次是超级源点    练习册     书     答案 ...

  8. 网络流小记(EK&dinic&当前弧优化&费用流)

    欢 迎 来 到 网 络 瘤 的 世 界 什么是网络流? 现在我们有一座水库,周围有n个村庄,每个村庄都需要水,所以会修水管(每个水管都有一定的容量,流过的水量不能超过容量).最终水一定会流向唯一一个废 ...

  9. 网络流 - dinic + 当前弧优化【代码】

    这是初学网络流的时候从<算法竞赛进阶指南>抄下来的一份代码,自己理解的也不是很透彻. 注意,边要从 \(1\) 开始计,不然直接 \(xor\) 运算的话取反边会直接炸掉. #includ ...

随机推荐

  1. MVVM模式应用 之介绍

    M-V-VM (1)M:即Model,由现实世界抽象出来的模型: V:即View,视图,界面,该界面与用户输入设备进行交互: 但是View与Model如何进行交互呢? Binding便可以发挥作用了, ...

  2. var 的用法

    var 的用法相当于定义一个变量为局部的,如果在函数内部用 var 定义一个变量,函数执行结果后,该变量就消失,如果在函数内部不用 var 声明,则变量是全局的,在函数外部也可以用该变量. var a ...

  3. PHP设计模式之:策略模式

    <?phpabstract class Strategy{    public abstract function AlgorithmInterface();} class ConcreteSt ...

  4. 关于正则表达式的转义 PHP

    如正则的函数 preg_replace($patern, $replacement, $content) 等等 其中如果 $content 中要替换 \ 成 /,必须在 $patern中写成 \\\\ ...

  5. 前端开发web组件之旅(一)-- 定义与加载组件

    /* 前言 */ 自上而下的 职责和API应用层框架层框架浏览器 一 组件定义与调用 1.增加一个组件 tabview.css ------------------------------------ ...

  6. yii下多条件多表组合查询以及自写ajax分页

    多条件组合查询主要用到yii的CDbCriteria,这个类很多oem框架都有,非常好用. 前台表单 前台查询表单效果是这样的,多个条件组,每个组里放多个input,name为数组.当任何一个复选框被 ...

  7. ubuntu14.04安装wine以及国际版QQ

    公社(http://www.linuxidc.com/linux/2014-06/103768.htm)说: Wine (“Wine Is Not an Emulator” 的首字母缩写)是一个能够在 ...

  8. 把一个string串的所有小写字母转成大写字母的例子来看看看全局函数的使用

    今天写了一个小例子,把字符串里面的所有小写字母全部转换成大写字母http://blog.csdn.net/yasaken/article/details/7303903 1 #include &quo ...

  9. Multilingual App Toolkit v2.2 release

    Multilingual App Toolkit v2.2 release Today we released Multilingual App Toolkit v2.2. This release ...

  10. Noah的学习笔记之Python篇:命令行解析

    Noah的学习笔记之Python篇: 1.装饰器 2.函数“可变长参数” 3.命令行解析 注:本文全原创,作者:Noah Zhang  (http://www.cnblogs.com/noahzn/) ...