ISAP 最大流 最小割 模板
虽然这道题用最小割没有做出来,但是这个板子还是很棒:
- #include<stdio.h>
- #include<math.h>
- #include<string.h>
- #include<iostream>
- #include<algorithm>
- #define ll long long
- using namespace std;
- #define REP( i , a , b ) for ( int i = a ; i < b ; ++ i )
- #define REV( i , a , b ) for ( int i = a - 1 ; i >= b ; -- i )
- #define FOR( i , a , b ) for ( int i = a ; i <= b ; ++ i )
- #define FOV( i , a , b ) for ( int i = a ; i >= b ; -- i )
- #define CLR( a , x ) memset ( a , x , sizeof a )
- #define CPY( a , x ) memcpy ( a , x , sizeof a )
- const int MAXN = ;
- const int MAXQ = ;
- const int MAXE = ;
- const ll INF = ;
- struct Edge {
- int v , n ;
- ll c ;
- Edge () {}
- Edge ( int v , ll c , int n ) : v ( v ) , c ( c ) , n ( n ) {}
- } ;
- struct Net {
- Edge E[MAXE];
- int H[MAXN] , cntE ;
- int d[MAXN] , num[MAXN] , cur[MAXN] , pre[MAXN] ;
- int Q[MAXQ] , head , tail ;
- int s , t , nv ;
- int n , m ;
- ll flow ;
- int deg[MAXN] ;
- inline void init () {
- cntE = ;
- CLR ( H , - ) ;
- int i;
- for(i=; i <= n+ ; i++) H[i] = -;
- }
- inline void addedge ( int u , int v , ll c ) {
- E[cntE] = Edge ( v , c , H[u] ) ;
- H[u] = cntE ++ ;
- E[cntE] = Edge ( u , c , H[v] ) ;
- H[v] = cntE ++ ;
- }
- inline void rev_bfs () {
- CLR ( d , - ) ;
- int i;
- for(i=; i <= n+ ; i++) d[i] = -;
- CLR ( num , ) ;
- head = tail = ;
- Q[tail ++] = t ;
- d[t] = ;
- num[d[t]] = ;
- while ( head != tail ) {
- int u = Q[head ++] ;
- for ( int i = H[u] ; ~i ; i = E[i].n ) {
- int v = E[i].v ;
- if ( ~d[v] )
- continue ;
- d[v] = d[u] + ;
- num[d[v]] ++ ;
- Q[tail ++] = v ;
- }
- }
- }
- inline ll ISAP () {
- CPY ( cur , H ) ;
- rev_bfs () ;
- flow = ;
- int u = pre[s] = s ;
- while ( d[s] < nv ) {
- if ( u == t ) {
- ll f = INF , pos ;
- for ( int i = s ; i != t ; i = E[cur[i]].v )
- if ( f > E[cur[i]].c ) {
- f = E[cur[i]].c ;
- pos = i ;
- }
- for ( int i = s ; i != t ; i = E[cur[i]].v ) {
- E[cur[i]].c -= f ;
- E[cur[i] ^ ].c += f ;
- }
- flow += f ;
- u = pos ;
- }
- for ( int &i = cur[u] ; ~i ; i = E[i].n )
- if ( E[i].c && d[u] == d[E[i].v] + )
- break ;
- if ( ~cur[u] ) {
- pre[E[cur[u]].v] = u ;
- u = E[cur[u]].v ;
- } else {
- if ( == ( -- num[d[u]] ) )
- break ;
- int mmin = nv ;
- for ( int i = H[u] ; ~i ; i = E[i].n )
- if ( E[i].c && mmin > d[E[i].v] ) {
- cur[u] = i ;
- mmin = d[E[i].v] ;
- }
- d[u] = mmin + ;
- num[d[u]] ++ ;
- u = pre[u] ;
- }
- }
- return flow ;
- }
- inline void solve () {
- int u , v ;
- ll c ;
- init () ;
- CLR ( deg , ) ;
- s = ;
- t = n ;
- nv = t;
- REP ( i , , n ) {
- scanf ( "%d%d%lld" , &u , &v , &c ) ;
- addedge ( u , v , c ) ;
- ++ deg[u] ;
- ++ deg[v] ;
- }
- printf ( "%lld\n" , ISAP () ) ;
- }
- } x ;
- int main () {
- // while ( ~scanf ( "%d" , &x.n ) && ( x.n ) ) {
- // x.m = x.n - 1;
- scanf("%d",&x.n);
- x.solve () ;
- // }
- return ;
- }
ISAP 最大流 最小割 模板的更多相关文章
- 最大流/最小割模板(isap) POJ1273
isap模板核心代码: //d[]为距离标号数组,d[i]表示节点i到汇点的距离 //gap[]为GAP优化数组,gap[i]表示到汇点距离为i的节点个数 int dfs(int k,int flow ...
- 最大流-最小割 MAXFLOW-MINCUT ISAP
简单的叙述就不必了. 对于一个图,我们要找最大流,对于基于增广路径的算法,首先必须要建立反向边. 反向边的正确性: 我努力查找了许多资料,都没有找到理论上关于反向边正确性的证明. 但事实上,我们不难理 ...
- poj2914无向图的最小割模板
题意:给出无向图的点,边,权值.求最小割. 思路:根据题目规模,最大流算法会超时. 网上参考的模板代码. 代码: /*最小割集◎Stoer-Wagner算法:一个无向连通网络,去掉一个边集可以使其变成 ...
- 最大流&最小割 - 专题练习
[例1][hdu5889] - 算法结合(BFS+Dinic) 题意 \(N\)个点\(M\)条路径,每条路径长度为\(1\),敌人从\(M\)节点点要进攻\(1\)节点,敌人总是选择最优路径即最短路 ...
- UVa11248 Frequency Hopping(最大流+最小割)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=33206 [思路] 最大流最小割. 可以确定的是如果不可行需要修改的 ...
- matlab练习程序(最大流/最小割)
学习这个算法是为学习图像处理中的图割算法做准备的. 基本概念: 1.最大流是一个有向图. 2.一个流是最大流,当且仅当它的残余网络中不包括增广路径. 3.最小割就是网络中所有割中值最小的那个割,最小割 ...
- 「网络流24题」「LuoguP2774」方格取数问题(最大流 最小割
Description 在一个有 m*n 个方格的棋盘中,每个方格中有一个正整数.现要从方格中取数,使任意 2 个数所在方格没有公共边,且取出的数的总和最大.试设计一个满足要求的取数算法.对于给定的方 ...
- HDU6582 Path【优先队列优化最短路 + dinic最大流 == 最小割】
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6582 来源:2019 Multi-University Training Contest 1 题目大意 ...
- poj2914 Minimum Cut 全局最小割模板题
Minimum Cut Time Limit: 10000MS Memory Limit: 65536K Total Submissions: 8324 Accepted: 3488 Case ...
随机推荐
- svn cleanup failed–previous operation has not finished; run cleanup if it was interrupted
svn提交遇到恶心的问题,可能是因为上次cleanup中断后,进入死循环了. 错误如下: 解决方法:清空svn的队列 1.下载sqlite3.exe 2.找到你项目的.svn文件,查看是否存在wc.d ...
- ADO.NET 之 Entity Framework 基础
Entity Framework(EF)是使用直接映射到应用程序中业务对象的对象模型于关系数据库进行交互.它没有将数据视为行和列的集合,而是将其视为强类型对象(成为实体)的集合. 术语:LinQ to ...
- Unity3d Gis 坐标转换
最近在做unity3d与Gis结合的项目,最基本的就是坐标的转换问题,比如把经纬度为(166.23.9.27 , 39.55.15.74) 转换到unity里面成相应的位置点,废话不多说 上代码: u ...
- Java 加密PDF设置密码并添加水印
/** * Project Name:XXX * File Name:EncryptLogFile.java * Date:2016-6-12上午11:56:38 * Copyright (c) 20 ...
- 菜鸟崛起 DB Chapter 2 MySQL 5.6的概述与安装
在上文菜鸟崛起 DB Chapter 1 数据库概述我们初步认识了数据库,也知道市面上常见的几种数据库,下面我们就针对常见的MySQL数据库展开对DataBase的探讨. 2.1 MySQL介绍 M ...
- 搭建一个java开发环境的步骤
首先思考java开发环境需要些什么? 1.适用于我们开发环境的jdk 2.对应开发环境的IDE 3.如果是web应用,还需要web服务器,常用的有Tomcat 1) 下载对应组件 2) 安装 jdk安 ...
- 剑指offer js算法练习(1-10)
1.二维数组中的查找 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数, ...
- plupload批量上传分片(后台代码)
plupload批量上传分片功能, 对于文件比较大的情况下,plupload支持分片上传,后台代码如下: /** * * 方法:upLoadSpecialProgramPictrue * 方法说明:本 ...
- (eclipse)统一文件编码和代码风格
前言 1>每个人的代码风格不一样,以至于代码各式各样,有习惯=号左右加空格的,有习惯不加的,此举有时还会影响svn提交代码 2>注释代码不一样,并且注释风格也不一样 统一文件编码和代码风格 ...
- swiper不能手指滑动翻页的解决办法
/*当swiper中的slide的里面放入长度在手机上不能滑动的时候 放入这段代码就可以了*/ var startScroll, touchStart, touchCurrent; ...