Description:

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

Input:

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

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

Output:

一个数,为最大和

思路:仍旧是拆点 因为每个点都有一个限制K和一个价值V 所以将一个点拆成两个点,对相邻的点连两条边,一条费用为V,限制为1, 一条费用为0,限制为K - 1。然后跑个最大费用最大流即可

#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
const int N = , M = ;
int d[N], incf[N], pre[N], n, k, s, t, maxflow, ans;
bool vis[N]; int head[N],now;
struct edges{
int to,next,lim,w;
}edge[N<<];
void add(int x,int y,int z,int c){
edge[++now] = {y,head[x],z,c};
head[x] = now;
edge[++now] = {x,head[y],,-c};
head[y] = now;
} int id(int i,int j,int k){ return (i - )*n + j + k * n * n;} bool spfa(){
queue<int> q;
memset(d,0xcf,sizeof(d));
memset(vis,,sizeof(vis));
q.push(s); d[s] = ; vis[s] = ;
incf[s] = 1e9;
while(!q.empty()){
int x = q.front(); vis[x] = ; q.pop();
for(int i = head[x]; i; i = edge[i].next){
int v = edge[i].to;
if(!edge[i].lim) continue;
if(d[v] < d[x] + edge[i].w){
d[v] = d[x] + edge[i].w;
incf[v] = min(incf[x], edge[i].lim);
pre[v] = i;
if(!vis[v]) vis[v] = , q.push(v);
}
}
}
if(d[t] == 0xcfcfcfcf) return ;
return ;
}
void update(){
int x = t;
while(x != s){
int i = pre[x];
edge[i].lim -= incf[t];
edge[i ^ ].lim += incf[t];
x = edge[i ^ ].to;
}
maxflow += incf[t];
ans += d[t] * incf[t];
}
int main(){
ios::sync_with_stdio(false);
cin>>n>>k;
s = , t = *n*n;
now = ;
int x;
for(int i = ; i <= n; i++)
for(int j = ; j <= n; j++){
cin>>x;
add(id(i,j,),id(i,j,),,x);
add(id(i,j,),id(i,j,),k - ,);
if(j < n) add(id(i,j,),id(i,j+,),k,);
if(i < n) add(id(i,j,),id(i+,j,),k,);
}
while(spfa())
update();
cout<<ans<<endl;
return ;
}

最新文章

  1. Linux基础介绍【第八篇】
  2. DWZ (JUI) 教程 navTab 刷新分析
  3. 文件I/O(不带缓冲)之dup和dup2函数
  4. android用户界面之ScrollView教程实例汇总
  5. 微信js-sdk接口的使用及ios深坑
  6. Perl数据序列化和持久化(入门):Storable模块
  7. Structured Streaming Programming Guide结构化流编程指南
  8. fat32转ntfs命令
  9. Linux:挂载、卸载光盘
  10. IntelliJ IDEA 2017 激活
  11. arm那些事
  12. Atitit 遍历文件夹算法 autoit attilax总结
  13. SDOI 2017 天才黑客
  14. Hdu3549 Flow Problem 2017-02-11 16:24 58人阅读 评论(0) 收藏
  15. File.Exists(Application.StartupPath + \\Settings\\Settings.xml)
  16. mdadm Raid5 /dev/md0 lost a disk and recovery from another machine
  17. Git使用笔记三
  18. linux文件系统实现原理简述【转】
  19. C语言中的位操作(16)--计算二进制数字尾部连续0的数目
  20. 有待总结的KMP算法 sdut oj 2463 学密码学一定得学程序

热门文章

  1. U盘被分区后恢复方法
  2. mysql计算排名
  3. Hive初识(四)
  4. Kubernetes-DNS
  5. win7 下安装oracle 11g出现错误: 启动服务出现错误 找不到服务OracleMTSRecoveryService
  6. 初步学习pg_control文件之六
  7. Java开发WebService(使用Java-WS)
  8. Jmeter中传递cookie值
  9. 【SpringCloud】第二篇: 服务消费者(rest+ribbon)
  10. 用Python 的一些用法与 JS 进行类比,看有什么相似?