ACM/ICPC 之 卡卡的矩阵旅行-最小费用最大流(可做模板)(POJ3422)
将每个点拆分成原点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)的更多相关文章
- 最小费用最大流——EK+SPFA
终于把最小费用最大流学会了啊-- 各种奇奇怪怪的解释我已经看多了,但在某些大佬的指点下,我终于会了. 原来是个好水的东西. 最小费用最大流是什么? 不可能不知道网络流吧?如果不知道,自行百度去-- 费 ...
- 2018牛客网暑期ACM多校训练营(第五场) E - room - [最小费用最大流模板题]
题目链接:https://www.nowcoder.com/acm/contest/143/E 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K ...
- 51Nod 1084 矩阵取数问题 V2 —— 最小费用最大流 or 多线程DP
题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1084 1084 矩阵取数问题 V2 基准时间限制:2 秒 空 ...
- POJ 3422 Kaka's Matrix Travels 【最小费用最大流】
题意: 卡卡有一个矩阵,从左上角走到右下角,卡卡每次只能向右或者向下.矩阵里边都是不超过1000的正整数,卡卡走过的元素会变成0,问卡卡可以走k次,问卡卡最多能积累多少和. 思路: 最小费用最大流的题 ...
- hdu 2686 Matrix 最小费用最大流
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2686 Yifenfei very like play a number game in the n*n ...
- 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 ...
- HDU 5988.Coding Contest 最小费用最大流
Coding Contest Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)To ...
- HDU5900 QSC and Master(区间DP + 最小费用最大流)
题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5900 Description Every school has some legends, ...
- UVa11082 Matrix Decompressing(最小费用最大流)
题目大概有一个n*m的矩阵,已知各行所有数的和的前缀和和各列所有数的和的前缀和,且矩阵各个数都在1到20的范围内,求该矩阵的一个可能的情况. POJ2396的弱化版本吧..建图的关键在于: 把行.列看 ...
随机推荐
- Qt——一些工具的使用
一.使用Qt需要安装哪些软件 如果不使用VS,那么只需Qt组件就行了,安装完成后使用QtCreator进行编程. 如果使用VS,则需要安装下面几个: 1.Visual Studio 2.Qt组件 3. ...
- 《如何在大学里脱颖而出(How to Win at College)》读书笔记
<如何在大学里脱颖而出(How to Win at College)>读书笔记 图书简介 中文版: 英文版: 作者卡尔·纽波特(Cal Newport)于 2004 年6月以优等生荣誉学会 ...
- Ubuntu 下配置apache和APR
软件环境:ubuntu14.04 虚拟机Vmware 软件:http://httpd.apache.org/ httpd-2.2.29.tar.gz 不需要单独下载APR. 1.解压apach ...
- JS组件系列——BootstrapTable+KnockoutJS实现增删改查解决方案(二)
前言:上篇 JS组件系列——BootstrapTable+KnockoutJS实现增删改查解决方案(一) 介绍了下knockout.js的一些基础用法,由于篇幅的关系,所以只能分成两篇,望见谅!昨天就 ...
- JS组件系列——两种bootstrap multiselect组件大比拼
前言:今天继续来看看bootstrap的另一个组件:multiselect.记得在项目开始之前,博主项目组几个同事就使用哪些js组件展开过讨论,其中就说到了select组件,由于项目的整体风格使用的b ...
- 【翻译】DotNetMQ: 一个.NET版完整的消息队列系统
在一个大型的分布式系统中,消息队列是不可缺少的中间件,能很好的解决异步消息.应用解耦.均衡并发等问题.在.net中,偶然发现一个效率不错.安全可靠.功能齐全的消息组件,忍不住翻译过来,供大家快速预览. ...
- JQuery slidebox实现图片轮播
jQuery图片轮播(焦点图)插件jquery.slideBox,简单设置下参数就可以多个多种动画效果,左右,上下,速度,还可指定默认显示第N张,点击的按钮在现代浏览中可以实现圆形或圆角效果,插件代码 ...
- Character类
Character类 用来判断大小写 方法: public static boolean isUpperCase(char ch):判断是否大写 public static boolean isLow ...
- 使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【开篇】【持续更新中。。。】
最近发现web api很火,园内也有各种大神已经在研究,本人在asp.net官网上看到一个系列教程,原文地址:http://bitoftech.net/2013/11/25/detailed-tuto ...
- JS之Form表单相关操作
获取ID组件的值 var userid=document.getElementById('userid').value;var cdkey=document.getElementById('cdkey ...