Description

给出一个n*n的矩阵,每一格有一个非负整数Aij,(Aij <= 1000)现在从(1,1)出发,可以往右或者往下走,最后到达(n,n),每达到一格,把该格子的数取出来,该格子的数就变成0,这样一共走K次,现在要求K次所达到的方格的数的和最大

Input Description

第一行两个数n,k(1<=n<=50, 0<=k<=10)

接下来n行,每行n个数,分别表示矩阵的每个格子的数

Output Description

一个数,为最大和

Sample Input

3 1

1 2 3

0 2 1

1 4 2

Sample Output

11

Data Size & Hint

1<=n<=50, 0<=k<=10

恩......说实话这道题应该是网络流的题,但是想了半天也没有想出来......膜了网上的题解后才发现,这是道费用流的题(亏我一直在想怎么控制和最大)

知道这是费用流的以后就很好办了。由于每个点可能有两种情况,即之前没经过这个点时走到这个点,和之前已经走过这个点了。前一种情况需要计算贡献,而后一种情况则不需要。

然后,我们考虑如何控制这两种情况。我们可以将每个点x拆开,拆为x1与x2。这样每次从x1走到x2时就可以把这个点的贡献给算进去。由于前一种情况只有一次,而后一种情况最多有k-1次,所以我们在x1与x2之间连两种边,一种容量为1,费用为这个节点的值(对应第一种情况),另一种容量为k-1,费用为0(对应第二种情况)。然后考虑这个点往下和往右连边,假设这两个点分别为y,z,那么从x2往y1、z1分别连一条容量为k,费用为0的边即可(自己想一想,不难的)。然后跑一遍最大费用最大流即可。

代码如下:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<cmath>
 6 #define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)
 7 #define maxn 100010
 8 #define INF (1<<28)
 9 #define r(j) (j^1)
10
11 using namespace std;
12 typedef long long llg;
13
14 int head[maxn],to[maxn],next[maxn],c[maxn],f[maxn],ff[maxn];
15 int n,k,tt=1,ans,dis[maxn],d[maxn],fa[maxn],d2[maxn],l,r,hui;
16 bool w[maxn];
17
18 void link(int x,int y,int z,int o){
19     to[++tt]=y;next[tt]=head[x];head[x]=tt;
20     to[++tt]=x;next[tt]=head[y];head[y]=tt;
21     c[tt-1]=z; f[tt-1]=o; f[tt]=-o;
22 }
23
24 bool spfa(){
25     for(int i=1;i<=hui;i++) dis[i]=-1,d2[i]=INF;
26     dis[1]=0; l=r=0; d[r++]=1; w[1]=1;
27     while(l!=r){
28         int u=d[l++]; l%=maxn; w[u]=0;
29         for(int i=head[u],v;v=to[i],i;i=next[i])
30             if(c[i]>0 && dis[v]<dis[u]+f[i]){
31                 dis[v]=dis[u]+f[i];
32                 d2[v]=min(d2[u],c[i]);
33                 fa[v]=u; ff[v]=i;
34                 if(!w[v]){
35                     w[v]=1;d[r++]=v;
36                     r%=maxn;
37                 }
38             }
39     }
40     if(dis[hui]==-1) return 0;
41     ans+=dis[hui]*d2[hui];
42     int now=hui;
43     while(now!=1){
44         c[ff[now]]-=d2[hui];
45         c[r(ff[now])]+=d2[hui];
46         now=fa[now];
47     }
48     return 1;
49 }
50
51 int main(){
52     File("a");
53     scanf("%d%d",&n,&k);hui=n*n<<1;
54     for(int i=1,now=1,x;i<=n;i++)
55         for(int j=1;j<=n;j++,now++){
56             scanf("%d",&x);
57             link(now,now+n*n,1,x); link(now,now+n*n,k-1,0);
58             if(j<n) link(now+n*n,now+1,k,0);
59             if(i<n) link(now+n*n,now+n,k,0);
60         }
61     while(spfa());
62     printf("%d",ans);
63     return 0;
64 }

转载于:https://www.cnblogs.com/lcf-2000/p/5567608.html

codevs 1227 方格取数 2相关推荐

  1. [codevs 1227] 方格取数2

    [codevs 1227] 方格取数 2 题解: 注:这是CODEVS的方格取数2,走k次的版本. 因为每个格子可以走无数次,但走过一次之后数字就变成了0,也就是只有一次可以加上格子里的数字.所以要拆 ...

  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. Java中finally和return执行顺序
  2. iterm2 mac链接linux工具 桌面程序Transmit
  3. 从零开始学习OpenGL ES之五 – 材质
  4. Jacobi迭代法与Gauss-Seidel迭代法
  5. OpenCASCADE:构建线程
  6. 十万个为什么儿童版_把中国科技传播至阿语地区,少儿社《十万个为什么》阿拉伯文版亮相童书展...
  7. [开源] .Net 使用 ORM 访问 神舟通用数据库(神通)
  8. 爱情二十四课,妥协50分
  9. Java 面向对象:static的理解
  10. PN结空间电荷区形成原理
  11. 广工十四届校赛 count 矩阵快速幂
  12. ubuntu目录结构
  13. Java版扫雷小游戏
  14. android enable ipv6,安卓开启ipv6网络支持小米手机(miui)IPv6无法使用的问题
  15. css span 右端对齐_span右对齐
  16. web开发框架_Web开发的十大框架
  17. 来自一个大三开学三周的huster的迷茫与失措
  18. android 接电话 返回后黑屏,安卓手机打电话黑屏怎么办?解决安卓接电话黑屏
  19. 阿里云、腾讯云、七牛、网易云CDN简单对比
  20. 关于ImportError: DLL load failed: 找不到指定的模块

热门文章

  1. Oracle的join默认为,Oracle中的三种Join方法详解
  2. Verilog中生成语句(generate)的用法
  3. java字符串 n换行符_java切割字符串中的回车应注意是\n\r不是\n
  4. 为什么采用4~20mA的电流来传输模拟量?
  5. 虚拟机下Linux安装图解之一:VMware Workstation的安装
  6. js各种图表组件网站
  7. 使用 nginx 同域名下部署多个 vue 项目,并使用反向代理
  8. LINUX CentOS6.8 wdcp面板安装
  9. Application Virtualization 4.5 部署之(一)
  10. JAVA写HTTP代理服务器(三)-https明文捕获