HDU 4862(费用流)
Problem Jump (HDU4862)
题目大意
给定一个n*m的矩形(n,m≤10),每个矩形中有一个0~9的数字。
一共可以进行k次游戏,每次游戏可以任意选取一个没有经过的格子为起点,并且跳任意多步,每步可以向右方和下方跳。每次跳需要消耗两点间的曼哈顿距离减一的能量,若每次跳的起点和终点的数字相同,可以获得该数字的能量。(能量可以为负)
询问k次或更少次游戏后是否可以经过所有的格子,若可以求出最大的剩余能量。
解题分析
带权值的最小K路径覆盖。
(最小路径覆盖数=总节点数-最大匹配数)
将n*m个点,每个点拆成两个,X,Y。
由S向X连容量为1费用为0的边,Y向T连容量为1费用为0的边,X向可到达的Y连容量为1费用为所消耗能量(加上所得)。
这样直接跑可求出最大匹配数。所有未流满的Y点数量即为最小路径覆盖数。
考虑如何实现K路径覆盖。
新建一个点Q,由S向Q连容量为k费用为0的边,有Q向Y连容量为1费用为0的边。即表示可以新增的起点数为k。
这样跑一遍最小费用最大流,若不是满流则说明无解。
参考程序
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std; #define V 2008
#define E 1000008
#define INF 200000000
int n,m,k,S,T,Que,num;
int a[V][V],mark[V][V]; int pd[V],dis[V],pre[V];
struct line{
int u,v,c,w,nt;
}eg[E];
int lt[V],sum; void adt(int u,int v,int c,int w) {
eg[++sum].u=u; eg[sum].v=v; eg[sum].c=c;
eg[sum].w=w; eg[sum].nt=lt[u]; lt[u]=sum;
} void add(int u,int v,int c,int w) {
adt(u,v,c,w); adt(v,u,,-w);
//printf("%d %d %d %d\n",u,v,c,w);
} void init(){ sum=; num=;
memset(lt,,sizeof(lt)); char s[V];
scanf("%d %d %d",&n,&m,&k);
for (int i=;i<=n;i++){
scanf("%s",s+);
for (int j=;j<=m;j++)
{
a[i][j]=s[j]-'';
mark[i][j]=++num;
}
} S=; T=num*+;
add(S,T-,k,);
for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
{
add(S,mark[i][j],,);
add(mark[i][j]+num,T,,);
add(T-,mark[i][j]+num,,);
}
for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
for (int k=;k<=n;k++)
for (int l=;l<=m;l++)
if (i==k && l>j || j==l && k>i)
{
int x=abs(i-k)+abs(j-l)-;
if (a[i][j]==a[k][l]) x-=a[i][j];
add(mark[i][j],mark[k][l]+num,,x);
}
n=T;
} bool spfa() {
queue <int> Q;
for (int i=;i<=n;i++) {
dis[i]=INF;
pd[i]=;
pre[i]=-;
}
dis[S]=; pd[S]=; Q.push(S);
while (!Q.empty()) {
int u = Q.front();
for (int i=lt[u];i;i=eg[i].nt)
if (eg[i].c>) {
int v=eg[i].v;
if (dis[u]+eg[i].w<dis[v]) {
dis[v]=dis[u]+eg[i].w;
pre[v]=i;
if (!pd[v]) {
Q.push(v);
pd[v]=;
}
}
}
pd[u]=;
Q.pop();
}
return dis[T]!=INF;
} void minCmaxF(){
int minC=,maxF=,flow;
while (spfa()) {
flow=INF;
for (int i=pre[T];~i;i=pre[eg[i].u])
flow=min(flow,eg[i].c);
for (int i=pre[T];~i;i=pre[eg[i].u]) {
eg[i].c-=flow;
eg[i^].c+=flow;
}
maxF+=flow;
minC+=flow*dis[T];
}
if (maxF==num) printf("%d\n",-minC); else printf("-1\n"); } int main(){
scanf("%d",&Que);
for (int tt=;tt<=Que;tt++){
init();
printf("Case %d : ",tt );
minCmaxF();
}
}
HDU 4862(费用流)的更多相关文章
- Going Home HDU - 1533 费用流
http://acm.hdu.edu.cn/showproblem.php?pid=1533 给一个网格图,每两个点之间的匹配花费为其曼哈顿距离,问给每个的"$m$"匹配到一个&q ...
- hdu 5045 费用流
滚动建图,最大费用流(每次仅仅有就10个点的二分图).复杂度,m/n*(n^2)(n<=10),今年网络赛唯一网络流题,被队友状压DP秒了....难道网络流要逐渐退出历史舞台???.... #i ...
- HDU 3376 费用流 Matrix Again
题意: 给出一个n × n的矩阵,每个格子中有一个数字代表权值,找出从左上角出发到右下角的两条不相交的路径(起点和终点除外),使得两条路径权值之和最大. 分析: 如果n比较小的话是可以DP的,但是现在 ...
- hdu 2686 费用流 / 双线程DP
题意:给一个方阵,求从左上角出到右下角(并返回到起点),经过每个点一次不重复,求最大获益(走到某处获得改点数值),下来时每次只能向右或向下,反之向上或向左. 俩种解法: 1 费用流法:思路转化:从左 ...
- hdu 4406 费用流
这题问题就是当前时刻究竟选择哪门课程,易知选择是和分数有关的,而且是一个变化的权值,所以能够用拆点的方式,把从基础分到100分都拆成点.但若这样拆点的话,跑费用流时就必须保证顺序.这样就麻烦了..观察 ...
- hdu 1853 (费用流 拆点)
// 给定一个有向图,必须用若干个环来覆盖整个图,要求这些覆盖的环的权值最小. 思路:原图每个点 u 拆为 u 和 u' ,从源点引容量为 1 费用为 0 的边到 u ,从 u' 引相同性质的边到汇点 ...
- HDU 3667 费用流 拆边 Transportation
题意: 有N个城市,M条有向道路,要从1号城市运送K个货物到N号城市. 每条有向道路<u, v>运送费用和运送量的平方成正比,系数为ai 而且每条路最多运送Ci个货物,求最小费用. 分析: ...
- HDU 3667 费用流(拆边)
题意:有n个城市(1~n),m条有向边:有k件货物要从1运到n,每条边最多能运c件货物,每条边有一个危险系数ai,经过这条路的费用需要ai*x2(x为货物的数量),问所有货物安全到达的费用. 思路:c ...
- HDU 5644 (费用流)
Problem King's Pilots (HDU 5644) 题目大意 举办一次持续n天的飞行表演,第i天需要Pi个飞行员.共有m种休假计划,每个飞行员表演1次后,需要休假Si天,并提供Ti报酬来 ...
- HDU - 4780费用流
题意:M台机器要生产n个糖果,糖果i的生产区间在(si, ti),花费是k(pi-si),pi是实际开始生产的时间机器,j从初始化到生产糖果i所需的时间Cij,花费是Dij,任意机器从生产糖果i到生产 ...
随机推荐
- centos 6.5 64位编译 apache2.4
apache 2.4的安装和 apache2.2的安装有所不同 首先进入 http://apr.apache.org/download.cgi 下载 apr 和 apr-util 两个软件包 yum ...
- curl,chkconfig
1. Linux系统服务管理 工具ntsysv 类似图形界面管理工具,如果没有该命令使用 yum install -y ntsysv 安装 常用服务:crond, iptables, network, ...
- netbios wins dns LLMNR
NetBIOS名称 Network Basic Input/Output System (RFC-1001,1002)网络基本输入/输出系统协议 NetBIOS是一种高级网络接口,最初是在硬件中实 ...
- 【vmware vcp 5.1】安装及配置及笔记散记
ESXi的几个命令技巧: ------------------------------------------------- alt-f1: 进入console alt-f2: 返回DCUI alt- ...
- Windows XP PRO SP3 - Full ROP calc shellcode
/* Shellcode: Windows XP PRO SP3 - Full ROP calc shellcode Author: b33f (http://www.fuzzysec ...
- java中的native方法和修饰符(转)
Java中的native修饰符 今天偶然看代码,发现别人有这样写的方法,并且jar里面有几个dll文件,比较奇怪,于是把代码打开,发现如下写法. public native String GSMMod ...
- 二模 (4) day1
第一题: 题目描述: 有一个无穷序列如下:110100100010000100000…请你找出这个无穷序列中指定位置上的数字 解题过程: 1.考虑到1的数目比0少的多,就从1的位置的规律开始分析.前几 ...
- limit 百万级数据分页优化方法
mysql教程 这个数据库教程绝对是适合dba级的高手去玩的,一般做一点1万 篇新闻的小型系统怎么写都可以,用xx框架可以实现快速开发.可是数据量到了10万,百万至千万,他的性能还能那么高吗? 一点小 ...
- 分布式一致性原理—BASE
定义 BASE是BasicallyAvailable(基本可用).Soft state(软状态)和Eventually consistent(最终一致性)三个短语的简写,是由来自eBay的架构师Dan ...
- obj.offsetHeight与obj.style.height区别
我们都知道obj.offsetHeight与obj.style.height都可以获取obj的高度,但是在js使用中,我们通常会使用前者来获取高度,这是为什么,二者有什么样的区别呢. 1.obj.of ...