HDU3657Game(最大流)
这几天敲了几道最大流的问题,发现网络流真是模板算法啊。。。。
敲来敲去敲了几遍,基本每遍都敲得让人灰心,但同时也感受到了网络流的强大所在,这是我做网络流的第一题,,本以为看了一遍小白书的代码差不多理解就可以A掉一题的,没想到打击不是一点点的少啊。。。。。
首先小白书将的邻接矩阵存边,这里必须用邻接表,而本以为随便改改就好的,没想到那个记录路径却让人头疼得要命,无赖之下看了题解,看到了一个名为SAP的强大算法,虽然比小白的代码量增加了不少,理解起来也不是很容易,但是复杂度真心减少了不知一点点啊!!!!
虽然履步维艰,最后慢慢看着大牛模板一点一点敲了出来,可是其实还不是特别的了解的说,只是大致明白了思路而已,没办法看不懂就背下来吧,相信敲得多了自然就会慢慢理解记住的。。。
下面的SAP代码风格是我在网上找了一些后自己最觉得满意的一种(看到很多人使用loop;goto语句,真心不想用那样的句子啊,真心强迫症患者啊。。。。)
(能有自己的网络流模板感觉真好~~~)
#include <map>
#include <set>
#include <stack>
#include <queue>
#include <cmath>
#include <ctime>
#include <vector>
#include <cstdio>
#include <cctype>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;
#define INF 0x3f3f3f3f
#define inf ((LL)1<<40)
#define lson k<<1, L, mid
#define rson k<<1|1, mid+1, R
#define mem0(a) memset(a,0,sizeof(a))
#define mem1(a) memset(a,-1,sizeof(a))
#define mem(a, b) memset(a, b, sizeof(a))
#define FOPENIN(IN) freopen(IN, "r", stdin)
#define FOPENOUT(OUT) freopen(OUT, "w", stdout)
template<class T> T ABS ( T a) { return a >= ? a : -a; }
template<class T> T CMP_MIN ( T a, T b ) { return a < b; }
template<class T> T CMP_MAX ( T a, T b ) { return a > b; }
template<class T> T MAX ( T a, T b ) { return a > b ? a : b; }
template<class T> T MIN ( T a, T b ) { return a < b ? a : b; }
template<class T> T GCD ( T a, T b ) { return b ? GCD ( b, a % b ) : a; }
template<class T> T LCM ( T a, T b ) { return a / GCD ( a, b ) * b; }
template<class T> void SWAP( T& a, T& b ) { T t = a; a = b; b = t; } typedef __int64 LL;
//typedef long long LL;
const int MAXN = ;
const int MAXM = ;
const double eps = 1e-;
const double PI = 4.0 * atan(1.0);
const LL MOD = ; int dx[] = {, -, , };
int dy[] = {, , -, }; int n, m, k, ma[][], mus[][], sum; struct Edge { int to, cap, next; }edge[MAXM<<];
int head[MAXN], tot; int src, des;
int dep[MAXN], gap[MAXN], pre[MAXN], aug[MAXN], cur[MAXN]; void init()
{
int x, y;
mem0(mus); mem0(edge);sum = ;
for(int i = ; i <= n; i ++)
{
for(int j = ; j <= m; j ++ )
{
scanf("%d", &ma[i][j]);
sum += ma[i][j];
}
}
for(int i = ; i < k; i ++)
{
scanf("%d %d", &x, &y);
mus[x][y] = ;
}
} void addEdge(int u, int v, int val)
{
edge[tot].to = v; edge[tot].cap = val; edge[tot].next= head[u];
head[u] = tot ++;
edge[tot].to = u; edge[tot].cap = ; edge[tot].next = head[v];
head[v] = tot ++;
} void init_Edge()
{
mem1(head); tot = ;
src = ; des = m * n + ;
for(int i = ; i <= n; i ++)
{
for(int j = ; j <= m; j ++)
{
int now = (i-)*m + j;
if((i+j)&){
if(mus[i][j]) addEdge(now, des, INF);
else addEdge(now, des, ma[i][j]);
}
else {
if(mus[i][j]) addEdge(src, now, INF);
else addEdge(src, now, ma[i][j]);
for(int k = ; k < ; k ++ ) {
int nx = i + dx[k], ny = j + dy[k];
if(nx> && nx<=n && ny> && ny<=m)
addEdge(now, (nx-)*m+ny, *(ma[i][j]&ma[nx][ny]));
}
}
}
}
} int SAP(int n)
{
mem0(aug); mem0(pre);
mem(dep, ); mem(gap, );
int max_flow = , u = src;
aug[src] = INF;
pre[src] = -;
gap[] = n;
for(int i = ; i <= n; i ++)
cur[i] = head[i];
while(dep[src] < n)
{
//printf("%d\n", u);
if(u == des)
{
// printf("%d\n", max_flow);
max_flow += aug[des];
for(int v = pre[des]; v != -; v = pre[v])
{
int e = cur[v];
edge[e].cap -= aug[des];
edge[e^].cap += aug[des];
aug[v] -= aug[des];
if(edge[e].cap == ) u = v;
//u = src;
}
}
int flag = ;
for(int e = cur[u]; e != -; e = edge[e].next)
{
int v = edge[e].to;
if(edge[e].cap > && dep[u] == dep[v] + )
{
flag = ;
pre[v] = u; cur[u] = e;
aug[v] = MIN(aug[u], edge[e].cap);
u = v;
break;
}
}
if(!flag)
{
if(--gap[dep[u]] == )
break;
int min_dep = n;
cur[u] = head[u];
for(int e = head[u]; e != -; e = edge[e].next)
{
int v = edge[e].to;
if(edge[e].cap > && dep[v] < min_dep)
{
min_dep = dep[v];
cur[u] = e;
}
}
dep[u] = min_dep + ;
gap[dep[u]] ++;
if(u != src) u = pre[u];
}
}
return max_flow;
} int main()
{
while(~scanf("%d %d %d", &n, &m, &k))
{
init();
init_Edge();
printf("%d\n", sum - SAP(des+));
}
return ;
}
HDU3657Game(最大流)的更多相关文章
- 使用C#处理基于比特流的数据
使用C#处理基于比特流的数据 0x00 起因 最近需要处理一些基于比特流的数据,计算机处理数据一般都是以byte(8bit)为单位的,使用BinaryReader读取的数据也是如此,即使读取bool型 ...
- HTML 事件(三) 事件流与事件委托
本篇主要介绍HTML DOM中的事件流和事件委托. 其他事件文章 1. HTML 事件(一) 事件的介绍 2. HTML 事件(二) 事件的注册与注销 3. HTML 事件(三) 事件流与事件委托 4 ...
- FILE文件流的中fopen、fread、fseek、fclose的使用
FILE文件流用于对文件的快速操作,主要的操作函数有fopen.fseek.fread.fclose,在对文件结构比较清楚时使用这几个函数会比较快捷的得到文件中具体位置的数据,提取对我们有用的信息,满 ...
- java.IO输入输出流:过滤流:buffer流和data流
java.io使用了适配器模式装饰模式等设计模式来解决字符流的套接和输入输出问题. 字节流只能一次处理一个字节,为了更方便的操作数据,便加入了套接流. 问题引入:缓冲流为什么比普通的文件字节流效率高? ...
- java 字节流与字符流的区别
字节流与和字符流的使用非常相似,两者除了操作代码上的不同之外,是否还有其他的不同呢?实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作 ...
- BZOJ 3504: [Cqoi2014]危桥 [最大流]
3504: [Cqoi2014]危桥 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1407 Solved: 703[Submit][Status] ...
- java I/O流
输入流(读取数据的流) BufferedInputStream---继承--->FileInputStream--继承--->InputStream------> (1)字节流操作中 ...
- Ford-Fulkerson 最大流算法
流网络(Flow Networks)指的是一个有向图 G = (V, E),其中每条边 (u, v) ∈ E 均有一非负容量 c(u, v) ≥ 0.如果 (u, v) ∉ E 则可以规定 c(u, ...
- .NET基础拾遗(3)字符串、集合和流
Index: (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开发基础 ...
随机推荐
- http server 下载地址
windows 64为位:https://www.apachelounge.com/download/
- java线程join的意思(转自http://zjj1211.blog_51cto_com)
Join,单词本事就是连接的意思. 先贴出几段代码猜猜结果. <1> public static int Main() { Alpha oAlpha = new Alpha(); Thre ...
- 【解题报告】[动态规划] RQNOJ - PID38 / 串的记数
原题地址:http://www.rqnoj.cn/problem/38 解题思路: 状态表示:dp[i][j][k]表示i个A,j个B,k个C组成的满足条件的字符串的个数 初始状态:dp[0][0][ ...
- mysql创建/删除表的例子
创建表 简单的方式 CREATE TABLE person ( number INT(11), name VARCHAR(255), birthday DATE ); 或者是 CREATE TABLE ...
- linux log4j 使用
1.首先到Apache官网下载log4j.jar文件http://logging.apache.org/log4j/1.2/download.html 引用到eclipse项目里面 2.在src目录下 ...
- file的getPath getAbsolutePath和getCanonicalPath的不同
file的这几个取得path的方法各有不同,下边说说详细的区别 概念上的区别:(内容来自jdk,个人感觉这个描述信息,只能让明白的人明白,不明白的人看起来还是有点难度(特别试中文版,英文版稍好些)所以 ...
- selenium python (四)键盘事件
#!/usr/bin/python# -*- coding: utf-8 -*-__author__ = 'zuoanvip' #在实际测试过程中,有时候我们需要使用tab键将焦点转移到下一个需要操作 ...
- 猎豹使用AI RoboForm填表
最近,Chrome同步书签好慢,另外因为工作的原因,chrome还是用来做工作的事情,自己的事情准备换到猎豹,但是一个重要的问题是强大的自动填表工具AI RoboForm没有整合到猎豹的地方: 搜索了 ...
- Java核心 --- 枚举
Java核心 --- 枚举 枚举把显示的变量与逻辑的数字绑定在一起在编译的时候,就会发现数据不合法也起到了使程序更加易读,规范代码的作用 一.用普通类的方式实现枚举 新建一个终态类Season,把构造 ...
- 40个最好的Tumblr主题
如果安装了一款较好的Tumblr主题,你的Tumblr空间将焕然一新.然而找到一款合适的主题并不是一件容易的事,这正是本文中我整理那么多优质的Tumblr模板作为灵感的原因.其中有一些免费的Tumbl ...