HDU4862-Jump(最大流量最大费用流)
题意:有n*m的格子,每一个格子包含一个数字,0-9。你初始的能量为0,你可以玩k次,每一个你可以选择你现在的格子的正下方或者正右方的任意一个格子跳,但必须是之前没有跳过的格子。每玩一次你都可以跳任意次。每跳一次,从(x1, y1) 到 (x2, y2),你将花费|x1-x2|+|y1-y2|-1的能量,如果起止格子的数字相同,你能获得格子里数字的能量。
问你在把每一个格子都经过的基础上,所能得到的最大能量。
每个格子只能经过一个,你可以跳少于k次。你的能量可以为负数。
>>之前做过成环覆盖所有点的题,拆点建立二分图,此题和那个题感觉有点像。
建图的方法就是源点连所有X部,流量为1,权值为0,所有Y部连汇点,流量是1,权值为0。
能够从a点走到b点,就从a的X部到b的Y部,权值就是花费。
然后在X部添加一个点Q,从源点连到Q流量为k,权值为0的边,Q到Y部每一个点都连流量为1,权值为0的边,来保证玩k次。
最后求一个最大流量最大费用就好了。
>>建图很巧妙,但是。。。不是很懂。。。。先记下方法了。。。
#include <algorithm>
#include <iostream>
#include <cstring>
#include <string>
#include <vector>
#include <bitset>
#include <cstdio>
#include <queue>
#include <stack>
#include <cmath>
#include <list>
#include <map>
#include <set>
#define pk(x) printf("%d\n", x)
using namespace std;
#define PI acos(-1.0)
#define EPS 1E-6
#define clr(x,c) memset(x,c,sizeof(x))
//#pragma comment(linker, "/STACK:102400000,102400000")
typedef long long ll; #include <iostream>
#include <cstring>
#include <cstdio> using namespace std;
const int MAXV = ;
const int INF = <<; struct Edge { int to, cap, cost, rev; };
vector<Edge> G[MAXV];
int dist[MAXV], prv[MAXV], pre[MAXV], in[MAXV];
queue<int> que; void addedge(int from, int to, int cap, int cost) {
G[from].push_back((Edge){to, cap, cost, G[to].size()});
G[to].push_back((Edge){from, , -cost, G[from].size()-});
} int min_cost_max_flow(int s, int t, int f) {
int res = ;
while (f > ) {
for (int i = ; i <= t; ++i) dist[i] = -INF, in[i] = ;
dist[s] = ;
while (!que.empty()) que.pop();
in[s] = ;
que.push(s); while (!que.empty()) {
int u = que.front(); que.pop(); in[u] = ;
for (int i = ; i < G[u].size(); ++i) {
Edge &e = G[u][i];
if (e.cap > && dist[e.to] < dist[u] + e.cost) {
dist[e.to] = dist[u] + e.cost;
prv[e.to] = u;
pre[e.to] = i;
if (in[e.to] == ) {
in[e.to] = ;
que.push(e.to);
}
}
}
} if (dist[t] == -INF) return -; int d = f;
for (int v = t; v != s; v = prv[v]) {
d = min(d, G[prv[v]][pre[v]].cap);
}
f -= d;
res += d * dist[t];
for (int v = t; v != s; v = prv[v]) {
Edge &e = G[prv[v]][pre[v]];
e.cap -= d;
G[v][e.rev].cap += d;
}
}
return res;
} int n, m, k;
char str[][];
int id1(int x, int y) {
return x*m+y+;
}
int id2(int x, int y) {
return n*m+x*m+y+;
}
// |x1-x2|+|y1-y2|-1
int cost(int x1, int y1, int x2, int y2) {
int ans = -(abs(x1-x2)+abs(y1-y2)-);
if (str[x1][y1] == str[x2][y2]) ans += str[x1][y1] - '';
return ans;
} int main()
{
int T, cas = ;
scanf("%d", &T);
while (T--) {
scanf("%d%d%d", &n, &m, &k); for (int i = ; i < n; ++i) {
scanf("%s", str[i]);
} int src = ;
int q = n*m*+;
int sink = n*m*+; for (int i = src; i <= sink; ++i) G[i].clear(); addedge(src, q, k, ); for (int i = ; i < n; ++i) {
for (int j = ; j < m; ++j) { addedge(src, id1(i, j), , );
addedge(id2(i,j), sink, , );
addedge(q, id2(i,j), , ); for (int k = i+; k < n; ++k) {
addedge(id1(i, j), id2(k, j), , cost(i,j,k,j));
} for (int k = j+; k < m; ++k) {
addedge(id1(i,j), id2(i,k), , cost(i,j,i,k));
} }
} printf("Case %d : %d\n", ++cas, min_cost_max_flow(src, sink, n*m));
}
return ;
}
HDU4862-Jump(最大流量最大费用流)的更多相关文章
- HDU 4862 Jump 费用流
又是一个看了题解以后还坑了一天的题…… 结果最后发现是抄代码的时候少写了一个负号. 题意: 有一个n*m的网格,其中每个格子上都有0~9的数字.现在你可以玩K次游戏. 一次游戏是这样定义的: 你可以选 ...
- hdu4862 费用流(不错)
题意: 给你一个矩阵,你最多可以选择k条路线,k条路线的起点随意,每次行走的距离随意,但是只能往右或者下走,走过的点不能再走,而且每一步如果a->b,如果a和b的权值s相等那么就可以 ...
- 网络费用流-最小k路径覆盖
多校联赛第一场(hdu4862) Jump Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...
- BZOJ3130: [Sdoi2013]费用流[最大流 实数二分]
3130: [Sdoi2013]费用流 Time Limit: 10 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 960 Solved: 5 ...
- HDU4807 Lunch Time(费用流变种)
题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=4807 Description The campus of Nanjing Universit ...
- BZOJ-3130 费用流 (听题目胡扯丶裸最大流) 二分判定+最大流+实数精度乱搞
DCrusher爷喜欢A我做的水题,没办法,只能A他做不动的题了.... 3130: [Sdoi2013]费用流 Time Limit: 10 Sec Memory Limit: 128 MBSec ...
- 费用流&网络流模版
费用流模版: #include<cstdio> #include<cstring> #include<queue> using namespace std; ;// ...
- 【BZOJ3130】费用流(最大流,二分)
[BZOJ3130]费用流(最大流,二分) 题面 Description Alice和Bob在图论课程上学习了最大流和最小费用最大流的相关知识. 最大流问题:给定一张有向图表示运输网络,一个源点S和一 ...
- BZOJ2040[2009国家集训队]拯救Protoss的故乡——模拟费用流+线段树+树链剖分
题目描述 在星历2012年,星灵英雄Zeratul预测到他所在的Aiur行星在M天后会发生持续性暴雨灾害,尤其是他们的首都.而Zeratul作为星灵族的英雄,当然是要尽自己最大的努力帮助星灵族渡过这场 ...
随机推荐
- JNDI:对java:comp/env的研究
这两天研究了一下 context.lookup("java:comp/env/XXX")和直接context.lookup("XXX")的区别 网上关于这两个的 ...
- 学点PYTHON基础的东东--数据结构,算法,设计模式---观察者模式
按照小明明的设计模式抄抄看看.. http://dongweiming.github.io/python-observer.html # 这个是观察者基类 class Subject(object): ...
- 【安全组网】思科IOS设备基础应用
思科IOS有2种主要命令行模式:用户模式与特权模式 1.用户模式(user mode),当用“>”表示实在用户模式下 2.特权模式(exec mode),当用"#"表示是在特 ...
- sc.exe管理系统服务
sc.exe管理系统服务 下面介绍SC,SC QC,and SC QUERY sc.exe create HomerSatelliteDesktopGC binPath= "D:XXXXXX ...
- Android开发之一个未解决的bug
使用Activity之间传递数据的时候,出现了一个bug,但是没有找到哪里出错了. 把代码和log都记录下来,以后研究 代码: MainActivity.class package com.examp ...
- one-to-many many-to-one配置解释
one-to-many放在某个文件的配置中,表示这个文件是ONE的一方, 同样的many-to-one放在某个文件的配置中,表示这个文件是many的一方.
- 几款JS地图插件比较
因工作需要,最近研究几款关于地图的JS插件,现与大家分享一下. 以下比较只是浅层次的分析一下,并没有实际通过项目检验,所以不足之处还请大家指出. 地图插件对比 插件名 简介 区域支持 扩展性 离线支 ...
- session问题
如果 <sessionState mode="StateServer" stateConnectionString="tcpip=127.0.0.1:42424&q ...
- 第一个MVC模式的程序
数据库 是一个SQL sever数据库,结构很简单,创建名为firstMVC的数据库,只包含一个数据表(名称为Persons),其中共有三列,分别用于保存人员(persons)的ID.姓名以及创建日期 ...
- (转载)memcpy的几个实现版本
(转载)http://blog.sina.com.cn/s/blog_4d3a41f40100cvza.html 实现void *memcpy(void *to, const void *from, ...