/*
:最大费用流。构图:对于每个格子i,拆点 i 和 i',
每对拆点连两条边,一条费用为方格的数值,容量为1,另一条费用为0,容量为inf;
对于格子i可以转移到格子j,连边i'->j,费用为0,容量为inf。最后以(1,1)格子为源点,
(n,n)为汇点,限定最多增广k次,求最大费用流即为答案
*/
#include<stdio.h>
#include<string.h>
#include<vector>
#include<algorithm>
using namespace std;
const int maxn=6000;
const int INF=10000005;
const int MOD=9000000;
struct Node
{
int cap,cost,v,next;
}edge[MOD];
int cnt;
int head[maxn],q[MOD];
bool used[maxn];
int pre[maxn],cur[maxn],dis[maxn];
void add(int s,int t,int cap,int cost)
{
edge[cnt].cap=cap;
edge[cnt].cost=cost;
edge[cnt].next=head[s];
edge[cnt].v=t;
head[s]=cnt++;
edge[cnt].cap=0;
edge[cnt].cost=-cost;
edge[cnt].next=head[t];
edge[cnt].v=s;
head[t]=cnt++;
}
int min(int a,int b){return (a==-1||b<a)?b:a;}
int SPFA(int s,int t,int n)
{
int f=-1,r=0;
int i,v;
q[r]=s;
for(i=0;i<n;i++)
dis[i]=-1;
dis[s]=0;
pre[s]=s;
cur[s]=-1;
memset(used,false,sizeof(used));
used[s]=true;
while(f!=r)
{
f++;
if(f>=MOD)f-=MOD;
s=q[f];
used[s]=false;
for(i=head[s];i!=-1;i=edge[i].next)
{
v=edge[i].v;
if(edge[i].cap>0&&dis[s]+edge[i].cost>dis[v])
{
dis[v]=dis[s]+edge[i].cost;
pre[v]=s;
cur[v]=i;
if(!used[v])
{
used[v]=true;
r++;
if(r>=MOD)r-=MOD;
q[r]=v;
}
}
}
}
return dis[t];
}
int MinCost(int s,int t,int n,int m)
{
int ans=0;
int u,v,cap;
int cost;
int tot=0;
while(1)
{
cost=SPFA(s,t,n);
if(cost==INF)break;
u=v=t;
cap=-1;
tot++;
if(tot>m) break;
for(u=t;u!=s;u=pre[u])
{
cap=min(cap,edge[cur[u]].cap);
}
ans+=cost;
u=v=t;
for(u=t;u!=s;u=pre[u])
{
edge[cur[u]].cap-=cap;
edge[cur[u]^1].cap+=cap;
}
}
return ans;
}
int map[maxn][maxn];
int main()
{
int i,j;
int s,t;
int n,m,k;
while(scanf("%d%d",&n,&m)!=EOF){
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
scanf("%d",&map[i][j]);
memset(head,-1,sizeof(head));
cnt=0;
s=0;t=2*n*n+1;
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
if(i<n)
add((i-1)*n+j+n*n,i*n+j,INF,0);
if(j<n)
add((i-1)*n+j+n*n,(i-1)*n+j+1,INF,0);
add(s,(i-1)*n+j,INF,0);
add((i-1)*n+j,(i-1)*n+j+n*n,1,map[i][j]);
add((i-1)*n+j,(i-1)*n+j+n*n,INF,0);
add((i-1)*n+j+n*n,t,INF,0);
}
}
printf("%d\n",MinCost(s,t,t+1,m));
}
return 0;
}
Kaka's Matrix Travels POJ 3422 最大费用流
最新推荐文章于 2019-08-05 17:58:16 发布