题目链接:点击查看

题目大意:K取方格数,是在一个N*N的矩形网格中,每个格子里都写着一个整数。可以从左上角到右下角安排K条路线,每一步只能往下或往右,沿途经过的格子中的整数会被取走。若多条路线重复经过一个格子,只取一次。求能取得的整数的和最大是多少

题目分析:因为涉及到权值问题,我们希望权值最大,所以这就是一个费用流问题了,具体一下就是最大费用的最大流问题,具体该怎么设计呢,网络流基本上就是板子,需要我们在建边上动脑子,对于这个题目而言,因为权值是在点上的,我们可以将每个点拆成两个点,一个作为入点,一个作为出点,入点和出点之间连边,权值就是该点的权值,这样一来就能将点权转换到边权上了,再对于下面的方格和右边的方格建边,然后就可以跑费用流的模板了

代码:

#include<iostream>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<cmath>
#include<cctype>
#include<stack>
#include<queue>
#include<list>
#include<vector>
#include<set>
#include<map>
#include<sstream>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=55;int n,k;struct Edge
{int to,w,cost,next;
}edge[N*N*8];int head[N*N*2],cnt;void addedge(int u,int v,int w,int cost)
{edge[cnt].to=v;edge[cnt].w=w;edge[cnt].cost=cost;edge[cnt].next=head[u];head[u]=cnt++;edge[cnt].to=u;edge[cnt].w=0;edge[cnt].cost=-cost;edge[cnt].next=head[v];head[v]=cnt++;
}int d[N*N*2],incf[N*N*2],pre[N*N*2];bool vis[N*N*2];bool spfa(int s,int t)
{memset(d,0xcf,sizeof(d));memset(vis,false,sizeof(vis));queue<int>q;q.push(s);vis[s]=true;incf[s]=inf;d[s]=0;while(!q.empty()){int u=q.front();q.pop();vis[u]=false;for(int i=head[u];i!=-1;i=edge[i].next){int v=edge[i].to;int w=edge[i].w;int cost=edge[i].cost;if(!w)continue;if(d[v]<d[u]+cost){d[v]=d[u]+cost;pre[v]=i;incf[v]=min(incf[u],w);if(!vis[v]){vis[v]=true;q.push(v);}}}}return d[t]!=0xcfcfcfcf;
}int update(int s,int t)
{int x=t;while(x!=s){int i=pre[x];edge[i].w-=incf[t];edge[i^1].w+=incf[t];x=edge[i^1].to;}return d[t]*incf[t];
}int get_id(int x,int y,int t)
{return (x-1)*n+y+t*n*n;
}void init()
{memset(head,-1,sizeof(head));cnt=0;
}int main()
{
//  freopen("input.txt","r",stdin);
//  ios::sync_with_stdio(false);while(scanf("%d%d",&n,&k)!=EOF){init();int s=get_id(1,1,0);int t=get_id(n,n,1);for(int i=1;i<=n;i++)for(int j=1;j<=n;j++){int num;scanf("%d",&num);addedge(get_id(i,j,0),get_id(i,j,1),1,num);addedge(get_id(i,j,0),get_id(i,j,1),k-1,0);if(i<n)addedge(get_id(i,j,1),get_id(i+1,j,0),k,0);if(j<n)addedge(get_id(i,j,1),get_id(i,j+1,0),k,0);}int ans=0;while(spfa(s,t))ans+=update(s,t);printf("%d\n",ans);} return 0;
}

POJ - 3422 Kaka's Matrix Travels(网络流-最大费用最大流+拆点法)相关推荐

  1. poj 3422 Kaka's Matrix Travels(最小费用最大流)

    题目链接 Kaka's Matrix Travels Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9394   Accep ...

  2. POJ 3422 Kaka's Matrix Travels | 费用流

    最初的想法是这样的,先走一条最大费用流,沿路回来把所有的点的权值更新为0,然后再跑最大费用流,嗯,好像很对.后来想想,这完全不符合网络流的思想啊Orz. 题意: 一个矩阵,每个grid都有一个权值.从 ...

  3. POJ 3422 Kaka's Matrix Travels

    题目链接:ヾ(≧∇≦*)ゝ 大致题意:给你一个\(n*n\)的矩阵从\((1,1)\)出发,到\((n,n)\)结束,只能走右边或左边.每个点在被走过之后权值变成0,问走\(k\)次后,能获得的最大值 ...

  4. poj 3422 Kaka's Matrix Travels 费用流

    题目链接 给一个n*n的矩阵, 从左上角出发, 走到右下角, 然后在返回左上角,这样算两次. 一共重复k次, 每个格子有值, 问能够取得的最大值是多少, 一个格子的值只能取一次, 取完后变为0. 费用 ...

  5. hdu Kaka's Matrix Travels(最小费用最大流)

    把题意写一下:  给你一个n*n的矩阵,每个格子都有一个非负整数,从左上角走到右下角,收集走过的数字,累加,但是只能向右或者向下走,走过之后数字就变为0,让你求从左上角到右下角,走k次之后,所得的最大 ...

  6. POJ-3422-Kaka's Matrix Travels(最小费用最大流)

    题意:有个方阵,每个格子里都有一个非负数,从左上角走到右下角,每次走一步,只能往右或往下走,经过的数字拿走,换0 每次都找可以拿到数字和最大的路径走,走k次,求最大和 分析:最大费用最大流.因为点有权 ...

  7. pku 3422 Kaka's Matrix Travels 最大费用最大流

    http://poj.org/problem?id=3422 /* 题意:给定一个n*n的矩形方格,要求从(1,1)出发,只能往右下角走,(i + 1,j) 或者 (i + n,j)每次走完将格子里面 ...

  8. Kaka's Matrix Travels(减弱版) DP版

    Kaka's Matrix Travels(减弱版) Time Limit:5000MS  Memory Limit:65536K Total Submit:15 Accepted:8 Descrip ...

  9. poj3422 Kaka's Matrix Travels(最小费用最大流问题)

    1 /* 2 poj3422 Kaka's Matrix Travels 3 不知道 k次 dp做为什么不对??? 4 看了大牛的代码,才知道还可以这样做! 5 开始没有理解将a 和 a' 之间建立怎 ...

最新文章

  1. 2018-3-5 (论文—网络评论中结构化信息处理的应用于研究)笔记三(互信息,信息增益,期望交叉熵,基于词频的方法,CHI统计)
  2. 2017年前端开发工具趋势
  3. LeetCode Find All Anagrams in a String
  4. Shell与ShellScript
  5. 用C语言实现三子棋游戏
  6. boost::geometry::detail::overlay::get_relative_order用法的测试程序
  7. Weave Scope安装
  8. Bare HTTP不完全是RESTful
  9. 魅族2016Java互联网方向其中一道笔试题--青蛙跳台阶问题
  10. 监测wifi连接_超声波传感器在物联网河流水位监测过程中扮演重要角色
  11. javaWeb项目添加hibernate教程
  12. 关于DIPS的DLL注入(第22章)
  13. FDFS基础用法总结
  14. 智慧城市的投资运营与评估
  15. JAVA自学之路 来自尚学堂马士兵老师
  16. 常用测试用例设计方法4-场景法
  17. 百度快速排名关键词点击软件
  18. 网站在线客服系统源码|在线客服代码下载 (2021最新版)
  19. 赛格威航空T15评测骑行测试
  20. 关于idea中提交svn时一直显示performing VCS refresh

热门文章

  1. Redis数据库操作指令
  2. MyBatis 源码解读-settingsElement(settings)
  3. 再述autowiring
  4. 用户关联角色操作-流程分析
  5. 函数作为返回值练习 作用域和作用域链及预解析 闭包 闭包小案例
  6. 数据切分 垂直切分、垂直拆分与水平拆分的优缺点
  7. Disruptor并发框架-1
  8. mysql explain实践
  9. Spring Environment
  10. propertysource注解 找不到文件_WinXP系统电脑开机提示windows找不到null文件的解决方法...