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. LVS 介绍以及配置应用

    1.负载均衡集群介绍 1.1.什么是负载均衡集群 负载均衡集群提供了一种廉价.有效.透明的方法,来扩展网络设备和服务器的负载.带宽.增加吞吐量.加强网络数据的处理能力.提高网络的灵活性和可用性 搭建负 ...

  2. Oracel用rownum实现真分页

    因为oracle的rownum是一个伪列,使用的时候如果要用必须查询出来显示的标记例如本sql中标记为 num. 值得一提的是最内层的这个查询sql:“select a.集团规范编码...”本身有一个 ...

  3. 零售POS开发

    零售POS系统是一款基于离线与在线两种模式的POS系统,能够将门店的销售数据及时准确的同步到企业服务器.离线模式操作更加快捷.稳定.高效:在线操作实时同步会员信息.查看库存.下载最新档案.公文公告等一 ...

  4. 控制器view加载

    出自李明杰讲课视频

  5. python【第十二篇】Mysql基础

    内容: 1.数据库介绍及MySQL简介 2.MySQL基本操作 1 数据库介绍 1.1什么是数据库? 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,每个数据库都有一个或多个不同 ...

  6. 隐藏input边框(ie6、ie7)

    去掉元素的边框,我们一贯使用border:none; 但在ie6.ie7下的input[type=text]元素,并没有去掉. 两种解决方案: 1. border:none; 并设置背景backgro ...

  7. WPF之application对象

    WPF:Application简介 Application是一个地址空间,在WPF中应用程序就是在System.Windows命名空间下的一个Application实例.一个应用程序只能对应一个App ...

  8. 《C和指针》章节后编程练习解答参考——6.4

    <C和指针>——6.4 题目: 质数是只能被1和本身整除的整数. 在1到1000之间的质数,在数组中剔除不是质数的数. 解答代码: #include <stdio.h> #de ...

  9. 源码编译基于Android平台的XBMC笔记

    参考官方网站:https://github.com/xbmc/xbmc/blob/master/docs/README.android   1. 编译主机系统 Ubuntu (12.04) 64Bit ...

  10. tomcat出现的PermGen Space问题(bat,或者eclipse启动。)

    参考地址 http://www.blogjava.net/allen-zhe/archive/2007/12/18/168556.html 参考地址:http://javavsxiaoming.ite ...