http://codevs.cn/problem/1033/
//最大流
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<vector>
using namespace std;
struct edge {
int v,flow,to,next;
edge(int _v=0,int _flow=0,int _t=0,int _n=-1):v(_v),flow(_flow),to(_t),next(_n){}
}line[100000];
int _V[20001],va[60][90],map[60][90],tot=0;
queue <int> Q;
void add(int u,int v,int cap,int va){
line[tot++]=edge(va,cap,v,_V[u]);
_V[u]=tot-1;
line[tot++]=edge(-va,0,u,_V[v]);
_V[v]=tot-1;
}
int S,T,ctl,d[20001],f[20001][2];
bool vis[20001];
bool spfa() {
memset(d,127,sizeof(d));
memset(f,0,sizeof(f));
int INF=d[0];
Q.push(S);
d[S]=0;
while(!Q.empty()){
int pre=Q.front();Q.pop();
vis[pre]=0;
for(int k=_V[pre];k+1;k=line[k].next) {
int to=line[k].to;
if(line[k].flow&&line[k].v+d[pre]<d[to]) {
d[to]=d[pre]+line[k].v;
f[to][0]=k;
f[to][1]=pre;
if(!vis[to]){
vis[to]=1;
Q.push(to);
}
}
}
}
if(d[T]==INF)return false;
else return true;
}
int get_cost() {
int minx=10000000;
for(int k=T;k!=S;k=f[k][1]) {
int pos=f[k][0];
minx=min(minx,line[pos].flow);
}
for(int k=T;k!=S;k=f[k][1]) {
int pos=f[k][0];
line[pos].flow-=minx;
line[pos^1].flow+=minx;
}
return minx*d[T];
}
int ans_get() {
int ans=0;
while(spfa()) {
ans+=get_cost();
}
return ans*-1;
}
int main() {
memset(_V,-1,sizeof(_V));
int n,m,k;
cin>>n>>m>>k;
int poi=1;
for(int i=1;i<=n;i++)
for(int j=1;j<=m+i-1;j++) {
cin>>va[i][j];
va[i][j]*=-1;
map[i][j]=poi+2;
poi+=2;
}
S=poi+3,T=S+1;
add(S,0,k,0);
for(int i=1;i<=m;i++) {
add(0,map[1][i]-1,1,0);
add(map[1][i]-1,map[1][i],1,va[1][i]);
}
for(int i=2;i<=n;i++) {
for(int j=1;j<=m+i-1;j++) {
if(j<m+i-1)
add(map[i-1][j],map[i][j]-1,1,0);
if(j>1)
add(map[i-1][j-1],map[i][j]-1,1,0);
add(map[i][j]-1,map[i][j],1,va[i][j]);
}
}
for(int i=1;i<n+m;i++)add(map[n][i],T,1,0);
int ans=ans_get();
cout<<ans<<endl;
}
codevs-1033
最新推荐文章于 2021-07-04 17:13:23 发布