HDU 4862 Jump 任意起点最大权K链不相交覆盖
你可以从任意起点开始起跳最多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链不相交覆盖的更多相关文章
- HDU 4862 Jump(最小K路径覆盖)
输入一个n×m网格图,每个结点的值为0-9,可以从任意点出发不超过k次,走完每个点且仅访问每个结点一次,问最终的能量最大值.不可全部走完的情况输出-1. 初始能量为0. 而结点(x,y)可以跳跃到结点 ...
- HDU 4862 Jump 费用流
又是一个看了题解以后还坑了一天的题…… 结果最后发现是抄代码的时候少写了一个负号. 题意: 有一个n*m的网格,其中每个格子上都有0~9的数字.现在你可以玩K次游戏. 一次游戏是这样定义的: 你可以选 ...
- HDU 4862 Jump(更多的联合培训学校1)(最小费用最大流)
职务地址:pid=4862">HDU4862 最小费用流做的还是太少. 建图想不出来. . . 直接引用官方题解的话吧... 最小K路径覆盖的模型.用费用流或者KM算法解决,构造二部图 ...
- HDU 4862 JUMP 最小费用最大流
2014 多校的B题,由于我不怎么搞图论,当时碰到这个题目,我怎么想都没往网络流方面弄,不过网络流真的是个好东西,对于状态多变,无法用动规或者数据结构来很好表示的时候,非常有用 这个题目要求每个点一定 ...
- 【BZOJ2324】[ZJOI2011]营救皮卡丘 给定起点最小权K链可相交覆盖
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef ][]; int main() { i ...
- [HDU 5293]Tree chain problem(树形dp+树链剖分)
[HDU 5293]Tree chain problem(树形dp+树链剖分) 题面 在一棵树中,给出若干条链和链的权值,求选取不相交的链使得权值和最大. 分析 考虑树形dp,dp[x]表示以x为子树 ...
- hdu 4862 KM算法 最小K路径覆盖的模型
http://acm.hdu.edu.cn/showproblem.php?pid=4862 选t<=k次,t条路要经过全部的点一次而且只一次. 建图是问题: 我自己最初就把n*m 个点分别放入 ...
- 【HDU 2014 Multi-University Training Contest 1 1002】/【HDU 4862】Jump
多校训练就这么华丽丽的到了 ,于是乎各种华丽丽的被虐也開始了. 这是多校的1002; 最小费用最大流. 题目大意: 有n*m个方格,每一个方格都一个的十进制一位的数.你能够操作K次. 对于每一次操作, ...
- HDU 4862(费用流)
Problem Jump (HDU4862) 题目大意 给定一个n*m的矩形(n,m≤10),每个矩形中有一个0~9的数字. 一共可以进行k次游戏,每次游戏可以任意选取一个没有经过的格子为起点,并且跳 ...
随机推荐
- svn服务器端—管理员分配权限
1.SVN服务器搭建和使用 下载地址:http://subversion.apache.org/packages.html 滚动到浏览器底部,下载并安装:VisualSVN服务器端和tortoiseS ...
- DES 指定键的大小对于此算法无效
KEY (byte[]) 长度不为8. 一般KEY使用UTF8编码. byte[] byKey = Encoding.UTF8.GetBytes(key); 加密内容的编码,由两方协商. Sys ...
- phpstudy 8.0 安装redis并使用,解决phpstudy 8.0直接启用redis使用不了
目前phpstudy 8.0直接安装redis启用,是用不了的 在phpstudy 8.0环境面板中找到redis安装后: 打开redis安装目录配置文件redis.windows.conf配置red ...
- 常见的序列化框架及Protobuf序列化原理
原文链接:https://www.jianshu.com/p/657fbf347934 https://www.cnblogs.com/javazhiyin/p/11375553.html https ...
- C++知识点总结篇
const在不同位置时的不同意义 指针类型前:声明一个指向常量的指针,程序中不能通过指针来改变它所指向的值,但指针本身的值可以改变,即指针可以指向其他数据: "*"号和指针名之间, ...
- php生成动态验证码 加减算法验证码 简单验证码
预览效果: <?php /** *ImageCode 生成包含验证码的GIF图片的函数 *@param $string 字符串 *@param $width 宽度 *@param $height ...
- 字符串char vchar性能对比补充
Value CHAR(4) Storage Required VARCHAR(4) Storage Required '' ' ' 4 bytes '' 1 byte 'ab' 'ab ' 4 ...
- 18 COUNTIF函数
求大于小于等于某个数字的数字有多少 格式:=COUNTIF(数据区,"条件") 注意条件需要用英文双引号引起来. 举个例子: =COUNTIF(A2:D5,">20 ...
- 15 飞机大战:pygame入门、python基础串连
0 pygame模块的导入 import pygame导入pygame包 使用pygame.init()导入pygame的所有模块.只有导入模块pygame才能使用. 使用pygame.quit()卸 ...
- js 中加减乘除 比较精确的算法,js本身有些运算会出错,这里给出较精确的算法
问题这样的: 37.5*5.5=206.08 (JS算出来是这样的一个结果,我四舍五入取两位小数) 我先怀疑是四舍五入的问题,就直接用JS算了一个结果为:206.08499999999998 怎么会 ...