你可以从任意起点开始起跳最多K次

每次跳你可以选择往右或者往下跳 从(x1,y1)跳到(x2,y2) 消耗的能量是曼哈顿距离-1

但是如果每次跳的起点和终点格子里的数字是相同的为X的话你会得到X能量

问你跳K次能不能把整个图刚好跳完(每个点被经过一次) 如果可以的话输出能量的最大值

解:和最小链覆盖一样先把每个点拆成入点和出点 左边是出点 右边是入点 然后按照题意建好边

重要的是我们怎么限制最多起跳K次这个条件 解决方法是Add(S,S',K,0) 然后S'朝右边每个点连一条容量为1费用为0的边

为什么这样就是最多K条链呢?考虑最小链覆盖=|V|-匹配数 即匹配完后 右边没有被匹配的点(入点)是要被当作一条链的起点的 所以右边有几个没被匹配的点就要有几条链

所以我们限制右边最多只能有K个节点没被匹配到即可

#include<bits/stdc++.h>
#define reg register
using namespace std;
typedef long long ll;
typedef int JQK;
const int INF = 0x7f7f7f7f;
const int MAXN = , MAXM = ;
int Head[MAXN], cur[MAXN], to[MAXM << ], nxt[MAXM << ], f[MAXM << ], ed = ;
int S, T, MAXP, MAXF, pre[MAXN];
JQK lev[MAXN], mono[MAXM << ];
bool exist[MAXN];
inline void RR(int &x) {
char c;
bool sign = false;
for (c = getchar(); c < '' || c > ''; c = getchar())
if (c == '-') {
sign = true;
}
for (x = ; c >= '' && c <= ''; c = getchar()) {
x = x * + c - '';
}
sign && (x = -x);
}char f1[][];
int ff[][];
int num[][];
int main() {
int TNT;
int n, m, K;
RR(TNT);
for (int cas = ; cas <= TNT; cas++) {
int sum = ;
RR(n), RR(m), RR(K);
for (int i = ; i <= n; i++) {
scanf("%s", f1[i] + );
for (int j = ; j <= m; j++) {
ff[i][j] = f1[i][j] - '';
}
}
for (int i = ; i <= n; i++) {
for (int j = ; j <= m; j++) {
num[i][j] = ++sum;
}
}
MAXP = * sum + ;
init( * sum + , * sum + );
addedge(S, S - , K, );
for (int i = ; i <= n; i++) {
for (int j = ; j <= m; j++) {
addedge(S, num[i][j], , );
addedge(sum + num[i][j], T, , );
addedge(S - , sum + num[i][j], , );
}
}
for (int i = ; i <= n; i++) {
for (int j = ; j <= m; j++) {
int now = ff[i][j];
for (int k = i + ; k <= n; k++) {
int now2 = ff[k][j];
int add = (now == now2) ? now : ;
addedge(num[i][j], sum + num[k][j], , -(add - (k - i - )));
}
for (int k = j + ; k <= m; k++) {
int now2 = ff[i][k];
int add = (now == now2) ? now : ;
addedge(num[i][j], sum + num[i][k], , -(add - (k - j - )));
}
}
}
printf("Case %d : ", cas);
if (K < min(n, m)) {
printf("-1\n");
continue;
}
int anser = MCMF();
if (MAXF != sum) {
printf("-1\n");
} else {
printf("%d\n", -anser);
}
}
return ;
}

HDU 4862 Jump 任意起点最大权K链不相交覆盖的更多相关文章

  1. HDU 4862 Jump(最小K路径覆盖)

    输入一个n×m网格图,每个结点的值为0-9,可以从任意点出发不超过k次,走完每个点且仅访问每个结点一次,问最终的能量最大值.不可全部走完的情况输出-1. 初始能量为0. 而结点(x,y)可以跳跃到结点 ...

  2. HDU 4862 Jump 费用流

    又是一个看了题解以后还坑了一天的题…… 结果最后发现是抄代码的时候少写了一个负号. 题意: 有一个n*m的网格,其中每个格子上都有0~9的数字.现在你可以玩K次游戏. 一次游戏是这样定义的: 你可以选 ...

  3. HDU 4862 Jump(更多的联合培训学校1)(最小费用最大流)

    职务地址:pid=4862">HDU4862 最小费用流做的还是太少. 建图想不出来. . . 直接引用官方题解的话吧... 最小K路径覆盖的模型.用费用流或者KM算法解决,构造二部图 ...

  4. HDU 4862 JUMP 最小费用最大流

    2014 多校的B题,由于我不怎么搞图论,当时碰到这个题目,我怎么想都没往网络流方面弄,不过网络流真的是个好东西,对于状态多变,无法用动规或者数据结构来很好表示的时候,非常有用 这个题目要求每个点一定 ...

  5. 【BZOJ2324】[ZJOI2011]营救皮卡丘 给定起点最小权K链可相交覆盖

    #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef ][]; int main() { i ...

  6. [HDU 5293]Tree chain problem(树形dp+树链剖分)

    [HDU 5293]Tree chain problem(树形dp+树链剖分) 题面 在一棵树中,给出若干条链和链的权值,求选取不相交的链使得权值和最大. 分析 考虑树形dp,dp[x]表示以x为子树 ...

  7. hdu 4862 KM算法 最小K路径覆盖的模型

    http://acm.hdu.edu.cn/showproblem.php?pid=4862 选t<=k次,t条路要经过全部的点一次而且只一次. 建图是问题: 我自己最初就把n*m 个点分别放入 ...

  8. 【HDU 2014 Multi-University Training Contest 1 1002】/【HDU 4862】Jump

    多校训练就这么华丽丽的到了 ,于是乎各种华丽丽的被虐也開始了. 这是多校的1002; 最小费用最大流. 题目大意: 有n*m个方格,每一个方格都一个的十进制一位的数.你能够操作K次. 对于每一次操作, ...

  9. HDU 4862(费用流)

    Problem Jump (HDU4862) 题目大意 给定一个n*m的矩形(n,m≤10),每个矩形中有一个0~9的数字. 一共可以进行k次游戏,每次游戏可以任意选取一个没有经过的格子为起点,并且跳 ...

随机推荐

  1. 常见问题:MySQL/事务隔离

    数据库并行产生的问题 A事务撤销时,将B事务更改的数据撤销. A事务提交时,将B事务更改的同行数据覆盖. 脏读:A事务读取到了B事务未提交的数据. 不可重复读:A事务中同查询语句不幂等,读到已更新数据 ...

  2. 【Luogu P3919】可持久化数组

    数组是一种单点修改,单点查询的基础数据结构. 如果要对数组改进,使之可持久化,那么显然我们需要利用其它的数据结构来改进它. 对于单点修改和单点查询两种操作,很容易发现可持久化线段树也是支持这种操作的. ...

  3. Java面试 - 复制引用和复制对象的区别?

    复制引用:把原对象的地址赋给了一个新的引用变量,只要其中一个对象的属性发生变化,另一个对象的属性也随之发生变化. 复制对象:把原对象的内容赋给了一个新的对象,其中一个对象的属性发生变化,并不影响另一个 ...

  4. [.NET Core] - 使用 EF Core 的 Scaffold-DbContext 脚手架命令创建 DbContext

    Scaffold-DbContext 命令 参数 Scaffold-DbContext [-Connection] <String> [-Provider] <String> ...

  5. 克隆centos虚拟机导致eth0网卡不可用

    打开  vim /etc/udev/rules.d/70-persistent-net.rules可以看到eth0 eth1两个. 1.删除 NAME="eth0",即 # PCI ...

  6. SDK的使用步骤

    SDK包括三种类型文件: (1).头文件(.h) (2).库文件(.lib) (3).动态库(.dll) 第一步:在项目目录中新建一个Libs文件夹,再在该文件夹中分别新建inc文件夹和lib文件夹, ...

  7. 剑指offer64:滑动窗口的最大值

    1 题目描述 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值.例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4 ...

  8. 2019牛客暑期多校训练营(第四场)A meeting(dfs或dp,dp待更新)

    示例1: 输入: 4 21 23 13 42 4 输出:2 说明: They can meet at place 1 or 3. 题意:从K个点到达不联通图某个点需要的最短时间,这个最短时间是这K个人 ...

  9. CSS实现自适应分隔线的N种方法

    分割线是网页中比较常见的一类设计了,比如说知乎的更多回答 这里的自适应是指两边的横线会随着文字的个数和父级的宽度自适应 偷偷的看了一下知乎的实现,很显然是用一块白色背景覆盖的,加一点背景就露馅了 心想 ...

  10. c++智能指针介绍_补充

    不明白我做错了什么,这几天老婆给我冷战了起来,也不给我开视频让我看娃了..哎,心累!趁着今晚的一些空闲时间来对智能指针做个补充吧. 写完上篇“智能指针介绍”后,第二天上班途中时,突然一个疑问盘踞在心头 ...