codevs 1227 方格取数 2 【网络流+费用流基础】
2017-05-14 17:11
357 查看
codevs 1227 方格取数 2 【网络流+费用流基础】
时间限制: 1 s
空间限制: 128000 KB
题目等级 : 大师 Master
题解
查看运行结果
题目描述 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
csdn 插入代码的时候 有问题 唉 大家将就将就 或者把代码复制到到编译器中查看
题解
把点 一分为二 因为一个数只能取一次 所以流量为1 费用为权值
然后每个点 添加一条边到它的左边和下边 流量为k 费用为0
源点S 添加K条边到点1
点n*n和n*n*2添加k条边到T
#include <stdio.h>
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
class E{
public:
int to,next,c,w;
};
E e[40005];
int next[5005],pree[5005],dis[5005],pre[5005],vis[5005];
int n,k,ans,cnt=1,s=0,t=5002;
void add(int from,int to,int c,int w){
e[++cnt].to=to;e[cnt].next=next[from];e[cnt].c=c;e[cnt].w=w;next[from]=cnt;
e[++cnt].to=from;e[cnt].next=next[to];e[cnt].c=0;e[cnt].w=-w;next[to]=cnt;
}
int spfa(){
memset(dis,127,sizeof(dis));
memset(vis,0,sizeof(vis));
dis[s]=0;
vis[s]=1;
queue<int> q;
q.push(s);
while(q.size()){
int u=q.front();q.pop();vis[u]=0;
for(int i=next[u];i;i=e[i].next){
int v=e[i].to;
if(e[i].c && dis[u]+e[i].w<dis[v]){
dis[v]=dis[u]+e[i].w;
pre[v]=u;pree[v]=i;
if(!vis[v]){
q.push(v);
vis[v]=1;
}
}
}
}
if(dis[t]<(1<<28)) return 1;
return 0;
}
void mcf(){
for(int i=pree[t],u=pre[t];i;i=p
a171
ree[u],u=pre[u]){
ans+=e[i].w;
e[i].c--;
e[i^1].c++;
}
}
int main(){
cin>>n>>k;
int w;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>w;
int a=(i-1)*n+j,b=(i-1)*n+j+1,c=i*n+j,d=(i-1)*n+j+n*n;
add(a,d,1,-w);
if(j<n) add(a,b,k,0),add(d,b,1,0);
if(i<n) add(a,c,k,0),add(d,c,1,0);
}
}
add(s,1,k,0);
add(n*n,t,k,0);
add(n*n*2,t,k,0);
while(spfa()) mcf();
cout<<-ans;
return 0;
}
1227 方格取数 2
时间限制: 1 s空间限制: 128000 KB
题目等级 : 大师 Master
题解
查看运行结果
题目描述 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
csdn 插入代码的时候 有问题 唉 大家将就将就 或者把代码复制到到编译器中查看
题解
把点 一分为二 因为一个数只能取一次 所以流量为1 费用为权值
然后每个点 添加一条边到它的左边和下边 流量为k 费用为0
源点S 添加K条边到点1
点n*n和n*n*2添加k条边到T
#include <stdio.h>
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
class E{
public:
int to,next,c,w;
};
E e[40005];
int next[5005],pree[5005],dis[5005],pre[5005],vis[5005];
int n,k,ans,cnt=1,s=0,t=5002;
void add(int from,int to,int c,int w){
e[++cnt].to=to;e[cnt].next=next[from];e[cnt].c=c;e[cnt].w=w;next[from]=cnt;
e[++cnt].to=from;e[cnt].next=next[to];e[cnt].c=0;e[cnt].w=-w;next[to]=cnt;
}
int spfa(){
memset(dis,127,sizeof(dis));
memset(vis,0,sizeof(vis));
dis[s]=0;
vis[s]=1;
queue<int> q;
q.push(s);
while(q.size()){
int u=q.front();q.pop();vis[u]=0;
for(int i=next[u];i;i=e[i].next){
int v=e[i].to;
if(e[i].c && dis[u]+e[i].w<dis[v]){
dis[v]=dis[u]+e[i].w;
pre[v]=u;pree[v]=i;
if(!vis[v]){
q.push(v);
vis[v]=1;
}
}
}
}
if(dis[t]<(1<<28)) return 1;
return 0;
}
void mcf(){
for(int i=pree[t],u=pre[t];i;i=p
a171
ree[u],u=pre[u]){
ans+=e[i].w;
e[i].c--;
e[i^1].c++;
}
}
int main(){
cin>>n>>k;
int w;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>w;
int a=(i-1)*n+j,b=(i-1)*n+j+1,c=i*n+j,d=(i-1)*n+j+n*n;
add(a,d,1,-w);
if(j<n) add(a,b,k,0),add(d,b,1,0);
if(i<n) add(a,c,k,0),add(d,c,1,0);
}
}
add(s,1,k,0);
add(n*n,t,k,0);
add(n*n*2,t,k,0);
while(spfa()) mcf();
cout<<-ans;
return 0;
}
相关文章推荐
- 【费用流】【CODEVS】1227 方格取数2
- Codevs 1227方格取数 (费用流
- Codevs 1227 方格取数 2(费用流)
- 【费用流】codevs1227 方格取数 2
- codevs1907 方格取数 3||tyvj1338QQ农场|网络流
- codevs 1227 方格取数 2
- [网络流24题][CODEVS1237]餐巾计划问题(费用流)
- codevs1227 方格取数2
- 【codevs1907】[网络流24题]方格取数3
- codevs 1907 方格取数 网络流
- [网络流24题][CODEVS1914]运输问题(费用流)
- [网络流24题][CODEVS1916]负载平衡问题(费用流)
- code vs 1227 方格取数 2
- Codevs_P1227 方格取数2(拆点网络流+最小费用流)
- codevs1227 方格取数2 注意数组啊啊啊啊啊啊啊啊啊啊
- 03 代码编辑器-VsCode基础
- 【codevs1922】骑士共存问题——网络流
- VS Code折腾记 - (3) 多图解VSCode基础功能
- 【基础练习】【线性DP】codevs1058 合唱队形题解
- codevs2058 括号序列--栈基础应用