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