[codevs 1227] 方格取数 2

题解:

注:这是CODEVS的方格取数2,走k次的版本。

因为每个格子可以走无数次,但走过一次之后数字就变成了0,也就是只有一次可以加上格子里的数字。所以要拆点(X->Xi,Xj),在Xi和Xj之间连一条容量为1,费用为数字的相反数的边(取走该格数字),再连一条容量为INF,费用为0的边(第2,3...n次走该格)。再从每个格子的Xj点向左面及下面的格子的Xi点连一条容量为1,费用为0的边,最后从源点向第一个格子的Xi连一条容量为k(走k次)费用为0,从最后一个点的Xj向汇点连一条同样的边。求解最小费用最大流,费用的相反数就是答案。

代码:

总时间耗费: 149ms 
总内存耗费: 1 kB
#include<cstdio>
#include<iostream>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std; const int INF = 1e8 + 7;
const int maxn = 50 * 50 * 2 + 10;struct Edge{int from, to, cap, flow, cost;
};vector<Edge> edges;
vector<int> G[maxn];
int n, k, s, t;void encode(int i, int j, int& THIS, int& NEXT, int& DOWN, int& LEFT) {i--; j--;THIS = i * n + j + 1;NEXT = THIS + n*n;DOWN = i < n-1 ? THIS + n : 0;LEFT = j < n-1 ? THIS + 1 : 0;
}void AddEdge(int from, int to, int cap, int cost) {edges.push_back((Edge){from, to, cap, 0, cost});edges.push_back((Edge){to, from, 0, 0, -cost});int m = edges.size();G[from].push_back(m-2);G[to].push_back(m-1);
}int d[maxn], a[maxn], p[maxn];
bool inq[maxn];bool SPFA(int &cost) {for(int i = 0; i <= t; i++) d[i] = INF;memset(inq, 0, sizeof(inq));d[s] = 0; inq[s] = 1; a[s] = INF; p[s] = 0;queue<int> Q;Q.push(s);while(!Q.empty()) {int u = Q.front(); Q.pop();inq[u] = 0;for(int i = 0; i < G[u].size(); i++) {Edge& e = edges[G[u][i]];if(e.cap > e.flow && d[u] + e.cost < d[e.to]) {d[e.to] = d[u] + e.cost;p[e.to] = G[u][i];a[e.to] = min(a[u], e.cap - e.flow);if(!inq[e.to]) {Q.push(e.to);inq[e.to] = 1;}}}}if(d[t] == INF) return 0;cost += d[t] * a[t];int u = t; while(u != s) {edges[p[u]].flow += a[t];edges[p[u]^1].flow -= a[t];u = edges[p[u]].from;}return 1;
}int maxflow() {int cost = 0;while(SPFA(cost));return cost;
}int main() {cin >> n >> k;s = 0; t = n*n*2 + 1;for(int i = 1; i <= n; i++)for(int j = 1; j <= n; j++) {int THIS, NEXT, DOWN, LEFT;encode(i, j, THIS, NEXT, DOWN, LEFT);int w;cin >> w;AddEdge(THIS, NEXT, 1, -w);AddEdge(THIS, NEXT, INF, 0);if(LEFT) AddEdge(NEXT, LEFT, INF, 0);if(DOWN) AddEdge(NEXT, DOWN, INF, 0);}AddEdge(s, 1, k, 0);AddEdge(t-1, t, k, 0);cout << -maxflow() << endl;return 0;
}

[codevs 1227] 方格取数2相关推荐

  1. codevs 1227 方格取数 2

    Description 给出一个n*n的矩阵,每一格有一个非负整数Aij,(Aij <= 1000)现在从(1,1)出发,可以往右或者往下走,最后到达(n,n),每达到一格,把该格子的数取出来, ...

  2. codevs 1227 方格取数2

    网络流+拆点 π_π(好像HDU上有类似的题..那时我还是用Pascal写的) 算是裸题吧..然而我本不会费用流 看了下黄学长的代码,说下自己的理解(黄学长只贴了代码π_π) 把每一个点拆成两个点,一 ...

  3. [codevs 1907] 方格取数3

    [codevs 1907] 方格取数3 题解: 二分图染色.最大点权独立集. 因为要用到最大独立集的一些思路,故先写了一篇最大独立集的题解:http://blog.csdn.net/qq_211102 ...

  4. Codevs 1043 方格取数

    1043 方格取数 2000年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果 题目描述 Descriptio ...

  5. codevs 1907 方格取数 3

    Description 在一个有m*n 个方格的棋盘中,每个方格中有一个正整数.现要从方格中取数,使任意2 个数所在方格没有公共边,且取出的数的总和最大.试设计一个满足要求的取数算法. Input 第 ...

  6. codevs 1043 方格取数 2000年NOIP全国联赛提高组

    时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题目描述 Description 设有N*N的方格图(N<=10,我们将其中的某些方格中填入正整数,而 ...

  7. codevs 1907:方格取数3

    这个系列终于做完了.. 又是一道网络流 因为不能取相邻的点,很容易发现需要二分图 一半的点连源,另一半连汇,流量为map[i,j] 相邻的点连起来,流量为inf 答案就是总和减最大流 最大流...看这 ...

  8. 【codevs 1902】方格取数3(最小割)

    1907 方格取数 3 时间限制: 2 s   空间限制: 256000 KB    题目等级 : 大师 Master 题目描述 Description   在一个有m*n 个方格的棋盘中,每个方格中 ...

  9. 线性规划与网络流24题●09方格取数问题13星际转移问题

    ●(做codevs1908时,发现测试数据也涵盖了1907,想要一并做了,但因为"技术"不佳,搞了一上午) ●09方格取数问题(codevs1907  方格取数3) 想了半天,也没 ...

最新文章

  1. Libgdx New 3D API 教程之 -- 使用Libgdx加载模型
  2. Ajax中POST和GET的区别
  3. 【计算机网络】数据链路层 : 信道划分 介质访问控制 ( 数据链路 | 介质访问控制分类 | 频分多路复用 FDM | 时分多路复用 TDM | 波分复用 WDM | 码分多路复用 CDM 计算 )★
  4. Oracle 数据库启动 startup和startup force的区别
  5. SWF反编译神器ASV2013功能展示(下)
  6. rust的权限柜怎么做_潍坊装修知识~二胎家庭不做上下铺,把两张床靠墙放,中间做收纳柜,你感觉怎么样?...
  7. python中带附件发送电子邮件_python发送带附件邮件
  8. [深度学习-实践]人脸识别的例子-Tensorflow2.x Keras
  9. 贺利坚老师汇编课程46笔记:操作符offset取得标号的偏移地址
  10. 下列关于linux扩展名说法错误的是,全国计算机一级考试选择题集锦(2015年1月)
  11. 兄弟连BroPHP系列教程
  12. Excel2007版的常用功能(6):Excel数据透视表
  13. 在线轻松制作微信公众号封面次图的方法
  14. Verilog笔记(四)状态机
  15. 这双 Googler 设计的 Nike 鞋真的是──丑爆了
  16. [渝粤教育] 西南科技大学 仓储与配送管理 在线考试复习资料
  17. 学习C++可以做什么,可以从事哪些领域的工作
  18. 10 本最值得阅读的网络安全书籍推荐
  19. 08_微信小程序-BLE低功耗蓝牙开发-设备搜索
  20. 键盘钢琴html代码,Flash键盘钢琴 电脑键盘钢琴附键盘钢琴谱

热门文章

  1. 台湾大学林轩田机器学习技法课程学习笔记3 -- Kernel Support Vector Machine
  2. python编辑时怎样换行_python怎么换行输入
  3. 3DSlicer5:开发者必晓ABC
  4. 跨服务器post数据失败:验证视图状态 MAC 失败。如果此应用程序由网络场或群集承载,请确保 machineKey 配置指定了相同的 validationKey 和验证算法。的解决办法
  5. Libevent-网络服务器事件示例
  6. 小s结尾与大S结尾的汇编语言差异
  7. 杂项题的基本解题思路——3、压缩文件处理
  8. Java web 开发的概念、环境配置、创建项目过程详解(Eclipse)
  9. JVM -verbose参数详解(转)
  10. 基础知识---汇编学习笔记