POJ 3422 Kaka's Matrix Travels (最小费用最大流)
POJ 3422 Kaka's Matrix Travels
源点和左上角连边,流量为k,费用为0. 右下角与汇点连边。流量为k,费用为0.
每次在残余网络中找费用最短路进行增广就可以。
/*
ID: wuqi9395@126.com
PROG:
LANG: C++
*/
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<cmath>
#include<cstdio>
#include<vector>
#include<string>
#include<fstream>
#include<cstring>
#include<ctype.h>
#include<iostream>
#include<algorithm>
using namespace std;
#define INF (1 << 20)
#define LINF (1LL << 60)
#define PI acos(-1.0)
#define mem(a, b) memset(a, b, sizeof(a))
#define rep(i, a, n) for (int i = a; i < n; i++)
#define per(i, a, n) for (int i = n - 1; i >= a; i--)
#define eps 1e-6
#define debug puts("===============")
#define pb push_back
#define mkp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
#define POSIN(x,y) (0 <= (x) && (x) < n && 0 <= (y) && (y) < m)
typedef long long ll;
typedef unsigned long long ULL;
const int maxn = 5555;
const int maxm = 500000;
struct node {
int v, cap, nxt, cost;
} e[maxm * 2];
int g[maxn], cnt, st, ed, n, m;
int ans, flow;
int nt, k;
void add(int u, int v, int cap, int cost) {
e[++cnt].v = v;
e[cnt].cap = cap;
e[cnt].cost = cost;
e[cnt].nxt = g[u];
g[u] = cnt; e[++cnt].v = u;
e[cnt].cap = 0;
e[cnt].cost = -cost;
e[cnt].nxt = g[v];
g[v] = cnt;
}
void init() {
cnt = 1;
ans = flow = 0;
memset(g, 0, sizeof(g));
// 加边
int w;
int p = nt * nt;
for (int i = 1; i <= nt; i++) {
for (int j = 1; j <= nt; j++) {
scanf("%d", &w);
int id = (i - 1) * nt + j;
add(id, id + p, 1, -w);
add(id, id + p, k, 0);
if (i < nt) add(id + p, id + nt, k, 0);
if (j < nt) add(id + p, id + 1, k, 0);
}
}
st = 0, ed = p * 2 + 1;
n = ed;
add(st, 1, k, 0);
add(p * 2, ed, k, 0);
} int dis[maxn], que[maxn], pre[maxn];
bool vis[maxn];
bool spfa() {
int font = 0, rear = 1;
for(int i = 0; i <= n; i ++) {
dis[i] = INF;
vis[i] = false;
}
dis[st] = 0;
que[0] = st;
vis[st] = true;
while(rear != font) {
int u = que[font++];
font %= n;
vis[u] = false;
for(int i = g[u]; i; i = e[i].nxt) {
int v = e[i].v;
if(e[i].cap && dis[v] > dis[u] + e[i].cost) {
dis[v] = dis[u] + e[i].cost;
pre[v] = i;
if(!vis[v]) {
vis[v] = true;
que[rear++] = v;
rear %= n;
}
}
}
}
if(dis[ed] == INF) return false;
return true;
}
void augment() {
int u, p, mi = INF;
for(u = ed; u != st; u = e[p ^ 1].v) {
p = pre[u];
mi = min(mi, e[p].cap);
}
for(u = ed; u != st; u = e[p ^ 1].v) {
p = pre[u];
e[p].cap -= mi;
e[p ^ 1].cap += mi;
ans += mi * e[p].cost; // cost记录的为单位流量费用。必须得乘以流量。
}
flow += mi;
}
int MCMF() {
init();
while(spfa()) augment();
return ans;
}
int main () {
while(~scanf("%d%d", &nt, &k)) {
printf("%d\n", -MCMF());
}
return 0;
}
POJ 3422 Kaka's Matrix Travels (最小费用最大流)的更多相关文章
- POJ 3422 Kaka's Matrix Travels(费用流)
POJ 3422 Kaka's Matrix Travels 题目链接 题意:一个矩阵.从左上角往右下角走k趟,每次走过数字就变成0,而且获得这个数字,要求走完之后,所获得数字之和最大 思路:有点类似 ...
- POJ训练计划3422_Kaka's Matrix Travels(网络流/费用流)
解题报告 题目传送门 题意: 从n×n的矩阵的左上角走到右下角,每次仅仅能向右和向下走,走到一个格子上加上格子的数,能够走k次.问最大的和是多少. 思路: 建图:每一个格子掰成两个点,分别叫" ...
- [poj] 3422 Kaka's Matrix Travels || 最小费用最大流
原题 给一个N*N的方阵,从[1,1]到[n,n]走K次,走过每个方格加上上面的数,然后这个格上面的数变为0.求可取得的最大的值. 要求最大值,所以把边权全为负跑最小费用即可.因为只有第一次经过该点的 ...
- POJ 2135 Farm Tour (网络流,最小费用最大流)
POJ 2135 Farm Tour (网络流,最小费用最大流) Description When FJ's friends visit him on the farm, he likes to sh ...
- poj3422 Kaka's Matrix Travels(最小费用最大流问题)
/* poj3422 Kaka's Matrix Travels 不知道 k次 dp做为什么不对??? 看了大牛的代码,才知道还可以这样做! 开始没有理解将a 和 a‘ 之间建立怎样的两条边,导致程序 ...
- POJ3422 Kaka's Matrix Travels 【最大费用最大流】
Kaka's Matrix Travels Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8006 Accepted: ...
- POJ 3686:The Windy's(最小费用最大流)***
http://poj.org/problem?id=3686 题意:给出n个玩具和m个工厂,每个工厂加工每个玩具有一个时间,问要加工完这n个玩具最少需要等待的平均时间.例如加工1号玩具时间为t1,加工 ...
- poj Kaka's Matrix Travels
Kaka's Matrix Travels 题目: 给出一个矩阵.求仅仅能向下或者向右的情况下能得到的最大和.一般的是指遍历一次,而这个是能够反复走K次.每经过一次后就把该点设为0.求最大和. 算法: ...
- POJ 2195 Going Home / HDU 1533(最小费用最大流模板)
题目大意: 有一个最大是100 * 100 的网格图,上面有 s 个 房子和人,人每移动一个格子花费1的代价,求最小代价让所有的人都进入一个房子.每个房子只能进入一个人. 算法讨论: 注意是KM 和 ...
随机推荐
- podoWeb极品流氓软件
用firefox做页面网络性能测试, 打开网页就会发现页面不停的去请求googleapi.com上的jquery Or swfobject.js,页面就此卡住,一直在等待类似这两个请求的返回,知道Ab ...
- hdoj 2544 最短路(最短路+Dijkstrea算法)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2544 思路分析:该问题给定一个无向图,要求求从起始点到终点的最短路径长度:可以使用dijkstra算法 ...
- phantompy — phantompy 0.10 documentation
phantompy - phantompy 0.10 documentation phantompy¶ Release v0.10. phantompy is a BSD Li ...
- lua的前景??
除了专业的游戏公司,貌似很少人在用lua来做开发啊,国内的lua社区越来越不行了. lua还在不断的发展,但每次新版本c接口都改动很大,项目想要升级有点困难啊. lua还有前途吗?
- Linux相关问题-CentOS6.5 x64版本号下Tomcat无法自启动的解决的方法
前段时间使用阿里云server.使用的是Linux CentOS6.5系统,在搭建完Tomcat后发现,Tomcat无法自启动. 将启动tomcat的命令为tomcat_home/bin/startu ...
- hdu1711(终于搞懂了KMP算法了。。)
题意:给你两个长度分别为n(1 <= N <= 1000000)和m(1 <= M <= 10000)的序列a[]和b[],求b[]序列在a[]序列中出现的首位置.如果没有请输 ...
- HDU1029时钟(排序)
题意:是用两个指针的一个模拟时钟的时针和分针.两个指针形成一个角度.角度测量两个指针之间的最小角度.两只手之间的角度是大于或等于0,且小于或等于180度的度量.由于一个序列的五个不同的写入时间,格式为 ...
- JavaScript 高级程序设计(第3版)笔记——chapter7:函数表达式
一.函数表达式的语法形式 匿名函数 var functionName = function(arg0, arg1, arg2) { //函数体 } 二.函数表达式没有函数提升 var a = 1; i ...
- oc拨打电话方法
1,这种方法,拨打完电话回不到原来的应用,会停留在通讯录里,而且是直接拨打,不弹出提示NSMutableString * str=[[NSMutableString alloc] initWithFo ...
- 如何查看程序被哪个版本编译器编译的linux-gcc
如何查看程序被哪个版本编译器编译的linux-gcc http://bbs.csdn.net/topics/380000949 那是不可能的,除非你加入了调试信息,也就是编译的时候加入了-g参数,然后 ...