【POJ3422】Kaka's Matrix Travels【费用流】

POJ3422 Kaka's Matrix Travels 【费用流】* POJ3422 Kaka’s Matrix Travels Description On an N × N chessboard with a non-negative number in each grid, Kaka starts his matrix travels with SUM = 0. For each travel, Kaka moves one rook from t... 阅读详情

题目大意:

题目链接:http://poj.org/problem?id=3422
k k k次传纸条。
传纸条问题都不知道的话那我也就没办法了。
真香


思路:

k k k次传纸条也是一个比较经典的题目。它的解法是费用流。
如果重复经过的格子是重复计分的,那么就是一个很裸的费用流了(其实答案就是一次传纸条 × k \times k ×k),着重思考如何处理“重复的格子不重复计分”。
那么显然是需要拆点的。把每一个点 a a a拆成 a 1 a_1 a1​和 a 2 a_2 a2​,分别表示入点和出点。
考虑如何在这两个点之间连边。显然,这两个点中间一共要连 k k k条边,因为最多会经过 k k k次。但是只有其中1条边是有费用的,其他 k − 1 k-1 k−1条边都是没有费用的。
那么显然要在 a 1 , a 2 a_1,a_2 a1​,a2​之间连两种边:

  • 一条流量为1,费用为这个格子的权值的边
  • 一条流量为 k − 1 k-1 k−1费用为0的边

这样就可以有效解决重复的格子不重复计分的问题了。
接下来的连边就非常显然了。

  • S → 1 1 S\to1_1 S→11​(点1的入点),流量 m m m,费用0
  • n 2 2 → T {n^2}_2\to T n22​→T(最后一个点的出点,总共有 n 2 n^2 n2个点),流量 m m m,费用0
  • i 2 → ( i + n ) 1 i_2\to (i+n)_1 i2​→(i+n)1​,流量 m m m,费用0
  • i 2 → ( i + 1 ) 1 i_2\to (i+1)_1 i2​→(i+1)1​,流量 m m m,费用0

跑最大费用最大流就可以了。


代码:

#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;

const int N=5010,M=200010;
int n,m,x,S,T,tot=1,head[N],dis[N],pre[N];
bool vis[N];

struct edge
{
	int next,to,flow,cost,from;
}e[M];

void add(int from,int to,int flow,int cost)
{
	e[++tot].to=to;
	e[tot].from=from;
	e[tot].flow=flow;
	e[tot].cost=cost;
	e[tot].next=head[from];
	head[from]=tot;
}

bool spfa()  //费用流模板(spfa,addflow,mcmf)
{
	memset(dis,0xcf,sizeof(dis));
	memset(vis,0,sizeof(vis));
	memset(pre,0,sizeof(pre));
	dis[S]=0,vis[S]=1;
	queue<int> q;
	q.push(S);
	while (q.size())
	{
		int u=q.front(),v;
		q.pop();
		vis[u]=0;
		for (int i=head[u];~i;i=e[i].next)
		{
			v=e[i].to;
			if (e[i].flow&&dis[v]<dis[u]+e[i].cost)
			{
				dis[v]=dis[u]+e[i].cost;
				pre[v]=i;
				if (!vis[v])
				{
					vis[v]=1;
					q.push(v);
				}
			}
		}
	}
	return dis[T]>0;
}

int addflow()
{
	int minflow=0x3f3f3f3f;
	for (int i=T;i!=S;i=e[pre[i]].from)
		minflow=min(minflow,e[pre[i]].flow);
	for (int i=T;i!=S;i=e[pre[i]].from)
	{
		e[pre[i]].flow-=minflow;
		e[pre[i]^1].flow+=minflow;
	}
	return minflow*dis[T];
}

int mcmf()
{
	int cost=0;
	while (spfa())
		cost+=addflow();
	return cost;
}

int main()
{
	memset(head,-1,sizeof(head));
	scanf("%d%d",&n,&m);
	for (int i=1;i<=n*n;i++)
	{
		scanf("%d",&x);
		add(i,i+n*n,1,x);
		add(i+n*n,i,0,-x);
		add(i,i+n*n,m-1,0);
		add(i+n*n,i,0,0);
		if (i+n<=n*n)
		{
			add(i+n*n,i+n,m,0);
			add(i+n,i+n*n,0,0);
		}
		if (i%n)
		{
			add(i+n*n,i+1,m,0);
			add(i+1,i+n*n,0,0);
		}
	}
	S=n*n*2+1;
	T=n*n*2+2;
	add(S,1,m,0);
	add(1,S,0,0);
	add(n*n*2,T,m,0);
	add(T,n*n*2,0,0);
	printf("%d",mcmf());
	return 0;
}
【胡学长 带你学 Global Mapper 】如何将影像地图转换为国家2000坐标系 多部门联合开展工作坐标数据不匹配怎么办?Hi,我是胡学长!今天教大家如何利用Global Mapper将谷歌影像数据转换为国家2000坐标系影像数据 。 阅读详情

相关推荐

STM32F407标准库下ADC多通道DMA采集的配置与优化

本文详细介绍了STM32F407标准库下ADC多通道DMA采集的配置与优化方法。通过GPIO模拟输入配置、ADC时钟和模式设置、DMA传输参数配置等关键步骤,实现高效的多通道数据采集。文章还提供了性能优化技巧和常见问题排查指南,帮助开发者提升采样速率和稳定性。

weixin_29192141的博客 427

费用流 poj3422 Kaka's Matrix Travels

传送门:点击打开链接 题意:从(1,1)出发k次,到达(n,n),求经过的数字之和最大,如果多次经过某一个点,那个点的权值只被算一次 最经典的一道拆点的题 把点拆分成两层,对于(i,j)这个点,第一层和第二层直接添加一条费用为-A[i][j]容量为1的边,表示通过了就能加上这个点的权值 然后把每个点的第二层的点再连回到下一个点的第一层。 因为一个点可以被多次经过,只是权值只算一次而已,所

qwb的博客 822

跟着团子学SAP PS:BOM和项目结构的联动-BOM Transfer CN33

关于项目中的物料组件挂接你需要了解的一点功能

Lucas1211的博客 2万+

POJ - 3422 Kaka's Matrix Travels 费用流

传送门:POJ3422 题意:有一个N X N的矩阵,每个点都有对应的值,现在要从左上角走到右下角k次,每次只能往下走或者往右走,但是每个点的值只能获得一次,问最大可获得的值是多少。 思路:典型费用流,由于每个点的值只能获得一次,要拆点限制一下,然后就是因为点略多,加边的时候细心一点就好了。 代码: #include #include #include #include #include

WA是一笔财富 279

Mumax3高效模拟技巧:如何利用代码模板快速完成磁性材料特性分析

本文介绍了利用Mumax3代码模板库提升磁性材料微磁学模拟效率的核心方法。通过构建模块化的环境配置、材料库和特征长度计算模板,研究者可以快速组装模拟方案,自动化参数扫描与结果分析,从而将精力聚焦于物理问题本身,实现工作效率的指数级提升。

zz67890的博客 549

python基础语法与数据结构

本文摘要: Python基础语法包含输入输出、函数、变量、数据类型及运算符等内容。输入函数input()获取键盘输入并以字符串存储,输出函数print()可格式化输出数据。函数通过def定义,可带参数和返回值,提高代码复用性。变量无需声明类型,可动态赋值。数据类型包括数字、字符串、布尔及复合类型,可通过type()查看。运算符包含算术、赋值等类型,其中复合赋值运算符如+=可简化运算。类型转换函数如int()、str()等可实现显式类型转换。这些基础语法构成Python编程的核心要素。

MM602388的博客 431

poj 3422 Kaka's Matrix Travels (费用流)

Kaka's Matrix Travels Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7743   Accepted: 3111 Description On an N × N chessboard with a non-negative number i

Coding A World 817

【微信小程序】微信小程序开发环境搭建:安装微信小程序开发者工具

通过本文的介绍,你应该已经成功安装并配置了微信小程序开发者工具,为微信小程序开发做好了准备。接下来,你可以开始编写你的第一个小程序项目,探索更多有趣的功能和特性。祝你开发顺利,创造更多优秀的作品!

墨夶的博客 2946

POJ 3422 Kaka's Matrix Travels(费用流)

题目链接:点击打开链接 思路: 我们用流量来限制走的次数,  因为权值在结点上, 我们考虑拆点, 因为每个点的权值只能获得一次, 我们对于每个点连两条边, 一条容量为1费用为权值, 一条容量为k-1,费用为0, 跑最大费用流就行了。 细节参见代码: #include #include #include #include #include #include #include #

AC_Arthur的专栏 614

最新Python爬虫实战(入门爬虫篇)——案例3:爬取二次元cos图片批量下载到本地(附上完整爬虫代码)

本次案例通过Python爬虫技术实现了二次元图片的批量下载。代码采用模块化设计,函数实现cookies的自动解析,简化了配置流程,涵盖“请求列表页→提取详情页URL→请求详情页→提取图片链接→保存图片”的完整流程,与豆瓣案例的核心逻辑和格式完全对齐。学习重点包括:抓包工具定位多层级数据源、正则表达式匹配复杂链接、模拟请求头绕过反爬机制、文件名安全处理及自动化文件管理。需要注意控制请求频率并遵守网站使用规范,适用于入门爬虫实践,帮助学习者掌握多层级页面爬取的核心逻辑。

努力让自己发光,对的人才能迎着光而来 14万+

rk3568 适配以太网(mac 2 mac)

MDIO(Management Data Input/Output)是一种管理数据输入/输出协议,用于在以太网交换机和PHY(物理层收发器)之间进行通信。在Android中,MDIO总线用于控制网络接口的PHY芯片,例如通过MDIO总线访问PHY芯片的寄存器。这些寄存器包含了一些关于网络连接状态、链路速度和其他计算机网络相关信息的数据。MDIO总线通常由网络接口控制器(NIC)使用,以便在OS中管理PHY芯片。在Android设备上,MDIO总线通常由内核驱动程序管理,并且可以通过 /sys/bus/mdi

weixin_35723192的博客 2453

POJ3422 Kaka's Matrix Travels 最大费用流+拆点

最大费用流。 建图:1,对于每一个数字拆成两个点,之间连一条弧,容量为1,费用INF;            2,每两个能连通的点i和j  连(i,j) (i+n*n,j) (i,j+n*n) (i+n*n,j+n*n) 容量INF,费用0            3源点与1连,费用0,容量k,终点与n*n连,费用0容量k。 然后求一个最大费用,   Kaka's Matrix Trav

1411

【学习系列】SAP RAP 3:添加多层级的子节点

本文详细介绍了在SAP ABAP RAP开发中如何创建多层级业务对象。主要内容包括:1)创建明细和计划行层级的数据库表及CDS视图;2)使用association和composition关键字建立父子关联关系;3)创建各层级的投影视图并设置层级关系;4)更新行为定义,添加关联、操作权限等控制;5)更新服务定义公开新增视图;6)创建元数据扩展优化UI展示。通过这一系列步骤,实现了从抬头到明细再到计划行的完整业务对象层级结构,为后续UI功能扩展奠定了基础。

DeveloperMrMeng的博客 587

poj3422Kaka's Matrix Travels【最大费用流】

Kaka's Matrix Travels Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9402   Accepted: 3819 Description On an N × N chessboard with a non-negative number i

MissZhou要努力 618

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

poj3422 Kaka's Matrix Travels 拆点+费用流

题意: 有一个方阵,每个格子里有一个非负数。要求从左上角走到右下角走k次,每次只能向右或向下走, 每经过一个格子就把数取走,问走k次能取到的最大的和是多少。 思路: 本题求的是最大费用,只要将权值全部设为相反数,再用最小费用最大流即可。 每个点拆成两个点x和x',x和x'之间连两条边,一条容量为1,代价为权值的相反数,另一条容量为k-1,代价为0。 然后每个点向右向下各连一

Shion的专栏 627

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

POJ 3422 Kaka's Matrix Travels(费用流)

POJ 3422 Kaka's Matrix Travels(费用流) http://poj.org/problem?id=3422 题意:        给一个N*N的方阵,从[1,1]到[n,n]走K次,走过每个方格加上上面的数(每个方格初始都有一个非负数),然后这个格上面的数变为0。求可取得的最大的值。 分析:        其实把每个网格看成一条边的话,那么我们就是等于要找K次最

code 960

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

poj 3422 Kaka's Matrix Travels 费用流

源点和左上角建边,费用0流量k,右下角和汇点建边,费用0,流量k。 将每个点拆成2个点,a,A。 a->A建一条费用为当前点权值的相反数,流量为1的点,代表选这个点且只能选1次。 a->A再建一条费用为0,流量为INF的点,代表不选这个点。 A->右,A->下建一条费用为0,流量为INF的边,过渡用。 求最小费用流,相反数就是最大费用流。 #include #include #

727

POJ 3422 Kaka's Matrix Travels(网络流之费用流)

题目地址:POJ 3422 方法是对每个点i拆点成i'和i'',然后对每个i'和i''连一条费用为该点值,流量为1的边,再连1条费用为0,流量为k-1的边。 然后对每个点与右边下边相邻的点连边,流量均为INF,费用均为0。需要再建一源点与汇点,对于k次只需要在源点与汇点处进行限制即可。 代码如下: #include #include #include #include #inclu

scf0920 1190

poj3422 Kaka's Matrix Travels 最大费用流 (拆点)

题意:给你一个n*n(1 题解:将每个格子看成一个点A,然后把这个点A拆成两个点A和A'。如果点B在点A的右侧或下侧,那么点A'就与点B连一条费用为0,容量为无穷大的边。对于每两个点A和A',点A向点A'连一条费用为点A这个格子的值、容量为1的边和一条费用为0,容量为无穷大的边。再建立一个源点S。S与点C(1,1)连一条费用为0,容量为K的边,汇点定为点D'(n,n).然后可以求从点S到点D'(

ccsu_cherish 635

POJ 3422 Kaka's Matrix Travels 费用流

题目:http://poj.org/problem?id=3422题意:有一个n*n的矩阵,矩阵中每个格子都有一个数字,代表当前格子的财富值,现在如下操作:从左上角开始出发,然后只能往下或者往右走,走到一个格子可以取走其中的财富值,直到走到右下角。现在可以如此操作k次,其中一个格子的财富值只能取一次,问操作k次后得到的最大财富值。思路:首先把格子中的值取反。把每个格子拆成两个点,设为i和i+N,那么

弱智就要多努力 345

Kaka's Matrix Travels poj 3422 费用流

题目大意给一个N*N的方阵,从[1,1]到[n,n]走K次,走过每个方格加上上面的数,然后这个格上面的数变为0。求可取得的最大的值。分析建图很重要,这里用到拆点,将每个点拆成两个,这两点之间连两条边,一条容量为1,费用为该节点的值,另一条边容量为无穷或k,费用为0。(这样保证就算经过这点k次时,费用也只被计算一次)由于每个点只能往右或者往下走,所以将它和右边及下边的点连一条边,容量为无穷,费用为0.

A_loud_name 418

Kaka's Matrix Travels POJ 3422 最大费用流

/* :最大费用流。构图:对于每个格子i,拆点 i 和 i', 每对拆点连两条边,一条费用为方格的数值,容量为1,另一条费用为0,容量为inf; 对于格子i可以转移到格子j,连边i'->j,费用为0,容量为inf。最后以(1,1)格子为源点, (n,n)为汇点,限定最多增广k次,求最大费用流即为答案 */ #include #include #include #include u

Yukar_syt的专栏 1262

POJ3422 Kaka's Matrix Travels 最小费用流

Kaka's Matrix Travels Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9608 Accepted: 3911DescriptionOn an N × N chessboard with a non-negative number in each grid, Kaka starts his m

LuRiCheng的博客 532
上一篇: 【USACO3.1】解题报告
下一篇: 【洛谷P4168】蒲公英【分块】
stoorz1023
博客等级 码龄9年 101粉丝 595原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值