将每个点拆分成原点A与伪点B,A->B有两条单向路(邻接表实现时需要建立一条反向的空边,并保证环路费用和为0),一条残留容量为1,费用为本身的负值(便于计算最短路),另一条残留容量+∞,费用为0(保证可以多次通过该点,但费用只计算一次)。

  另外伪点B与原点右侧与下方的点有一条单向路(邻接表实现需要建立反向空边),残留容量为+∞,费用为0。源点0到点1有一条单向路,残留容量为K(可以通过K次),最后一个点的伪点2*n*n与汇点2*n*n+1有一条单向边,残留容量为K,两条边的费用都为0。

  构图成功后,走一次最小费用最大流即可。

//最小费用最大流问题-拆点
//Time:47Ms Memory:624K
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
#define MAX 55
#define MAXN 5005
#define INF 0x3f3f3f3f
struct Edge{
int u,v,r,w,next;
Edge(){}
Edge(int U,int V,int R,int W,int N):u(U),v(V),r(R),w(W),next(N){}
}e[MAXN*8];
int n,k;
int s,t;
int h[MAXN],le;
int m[MAX][MAX];
int pre[MAXN];
int cost[MAXN];
bool vis[MAXN];
void add(int u,int v,int r,int w)
{
e[le] = Edge(u,v,r,w,h[u]); h[u] = le++;
e[le] = Edge(v,u,0,-w,h[v]); h[v] = le++;
}
void build()
{
add(s, 1, k, 0);
add(2*n*n, t, k, 0);
for(int i = 1; i <= n*n; i++)
{
add(i, n*n+i, 1, -m[(i - 1)/n + 1][(i - 1)%n + 1]);
add(i, n*n+i, k, 0);
if(i % n) add(i+n*n, i+1, INF, 0);
if(i <= n*(n-1)) add(i+n*n, i+n, INF, 0);
}
}
bool spfa()
{
memset(pre,-1,sizeof(pre));
memset(vis,false,sizeof(vis));
memset(cost,INF,sizeof(cost));
queue<int> q;
q.push(s);
cost[s] = 0; vis[s] = true;
while(!q.empty()){
int cur = q.front();
q.pop(); vis[cur] = false;
for(int i = h[cur]; i != -1; i = e[i].next)
{
int v = e[i].v;
if(e[i].r && cost[v] > cost[cur] + e[i].w){
cost[v] = cost[cur] + e[i].w;
pre[v] = i;
if(!vis[v]){
vis[v] = true; q.push(v);
}
}
}
}
return cost[t] == INF? false: true;
}
int maxcostflow()
{
int maxFlow = 0;
while(spfa()){ //增广路
int mind = INF;
for(int i = pre[t]; i != -1; i = pre[e[i].u])
mind = min(mind, e[i].r);
for(int i = pre[t]; i != -1; i = pre[e[i].u])
{
e[i].r -= mind;
e[i^1].r += mind;
}
maxFlow += mind*cost[t];
}
return maxFlow;
}
int main()
{
//freopen("in.txt", "r", stdin);
memset(h, -1, sizeof(h));
scanf("%d%d", &n,&k);
s = 0; t = 2*n*n+1;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
scanf("%d", &m[i][j]);
build();
printf("%d\n", -maxcostflow());
return 0;
}

ACM/ICPC 之 卡卡的矩阵旅行-最小费用最大流(可做模板)(POJ3422)的更多相关文章

  1. 最小费用最大流——EK+SPFA

    终于把最小费用最大流学会了啊-- 各种奇奇怪怪的解释我已经看多了,但在某些大佬的指点下,我终于会了. 原来是个好水的东西. 最小费用最大流是什么? 不可能不知道网络流吧?如果不知道,自行百度去-- 费 ...

  2. 2018牛客网暑期ACM多校训练营(第五场) E - room - [最小费用最大流模板题]

    题目链接:https://www.nowcoder.com/acm/contest/143/E 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K ...

  3. 51Nod 1084 矩阵取数问题 V2 —— 最小费用最大流 or 多线程DP

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1084 1084 矩阵取数问题 V2  基准时间限制:2 秒 空 ...

  4. POJ 3422 Kaka's Matrix Travels 【最小费用最大流】

    题意: 卡卡有一个矩阵,从左上角走到右下角,卡卡每次只能向右或者向下.矩阵里边都是不超过1000的正整数,卡卡走过的元素会变成0,问卡卡可以走k次,问卡卡最多能积累多少和. 思路: 最小费用最大流的题 ...

  5. hdu 2686 Matrix 最小费用最大流

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2686 Yifenfei very like play a number game in the n*n ...

  6. hdu 1533 Going Home 最小费用最大流

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1533 On a grid map there are n little men and n house ...

  7. HDU 5988.Coding Contest 最小费用最大流

    Coding Contest Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)To ...

  8. HDU5900 QSC and Master(区间DP + 最小费用最大流)

    题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5900 Description Every school has some legends, ...

  9. UVa11082 Matrix Decompressing(最小费用最大流)

    题目大概有一个n*m的矩阵,已知各行所有数的和的前缀和和各列所有数的和的前缀和,且矩阵各个数都在1到20的范围内,求该矩阵的一个可能的情况. POJ2396的弱化版本吧..建图的关键在于: 把行.列看 ...

随机推荐

  1. Dell xps 13 9350待机时总是关机的处理方法

    现象: 年初买的dell xps13 9350,最近可能是由于win10做了一些更新,每次睡眠就自动关机了,重启很多次,修改电源选项都没用, 原因分析: 在网上搜了一下,有人发现xps15 9350也 ...

  2. AppBox升级进行时 - Entity Framework的增删改查

    AppBox 是基于 FineUI 的通用权限管理框架,包括用户管理.职称管理.部门管理.角色管理.角色权限管理等模块. Entity Framework新增数据 以新增用户为例,作为对比,先来看下使 ...

  3. Go语言总结(图片打开略慢请知晓)

  4. java 跨平台 数据类型 修饰符 程序结构

    java跨平台的实现: .java文件 ——编译(javac)——> 二进制字节码的.class文件 ——不同平台的虚拟机(JVM)——>对应硬件平台可执行的代码 java数据类型的划分: ...

  5. iOS提交后申请加急审核

    链接:https://developer.apple.com/appstore/contact/appreviewteam/index.html 在i would like to里选择加急审核 然后填 ...

  6. spring aop的使用

    使用上次整合的s2sh工程,加入aop的功能.aop(面向切面编程)是一种对oop的完善,比如在进行数据库操作的时候执行方法前或者后加入一条日志记录,使用一个额外的类去做日志操作,让dao类专注地做它 ...

  7. Extjs 学习总结-Ext.define自定义类

    本教程整理了extjs的一些基本概念及其使用,包括自定义类(Ext.define).数据模型.代理等.本节介绍使用Ext.define自定义类 使用Ext.define自定义类 1. 首先看看js中自 ...

  8. 使用JSF框架过程中的若干典型问题及其解决方案

    1.commandXxx点击后,不调用action中的方法: 原因1:xhtml后缀名的文件,最终也会转化为普通的html文件(这是熟悉JSF框架的关键.),commandXxx点击后不调用后台act ...

  9. 大熊君{{bb}}------春节期间你跳槽了吗?

    时间过的很快,转眼间又快过春节了,推荐你在春节期间跳槽,是基于以下几个原因: 1,命中率高 通常情况下,所有公司都会在年底进行一定幅度的裁员,而惟独这家公司在招工,这等于明摆着告诉公众他们现在面临严重 ...

  10. codevs2645 Spore

    题目描述 Description 某陈和某Y 最近对一个游戏着迷.那是Electronic Arts 今年发布的优秀的模拟经营类游戏,Spore. 在Spore 中,玩家将经历从单细胞生物到星系的统治 ...