费用流76分求调
查看原帖
费用流76分求调
448884
快乐的大童楼主2022/10/11 18:00
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<map>
#include<unordered_map>
#include<vector>
#include<queue>
#include<set>
#define x1 xx1
#define y1 yy1
#define IOS ios::sync_with_stdio(false)
using namespace std;
inline int R(){
	int x=0,f=1;char ch=getchar();
	while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
	while(isdigit(ch)){x=x*10+ch-48;ch=getchar();}return x*f;
}
inline void write(int x){
	if(x<0){x=-x;putchar('-');}
	int y=0;char z[70];
	while(x||!y){z[y++]=x%10+48;x/=10;}
	while(y--)putchar(z[y]);
}
inline void writesp(int x){
	if(x<0){x=-x;putchar('-');}
	int y=0;char z[70];
	while(x||!y){z[y++]=x%10+48;x/=10;}
	while(y--)putchar(z[y]);putchar(32);
}
inline void writeln(int x){
	if(x<0){x=-x;putchar('-');}
	int y=0;char z[70];
	while(x||!y){z[y++]=x%10+48;x/=10;}
	while(y--)putchar(z[y]);putchar(10);
}
inline char read(){
	char ch=getchar();
	while(1) ch=getchar();
	return ch;
}
const int N=1e7+5,M=105,V=0x3f3f3f3f;
int n,m,k,oilcost,drivecost,buildcost;
int b[M][M];
namespace MCMF{
	int S,T;
	struct edge{
		int to,nxt,w,cost;
	}a[N];
	int head[N],cnt=1;
	int ans;
	int dis[N],dinic[N],e[N],pre[N];
	bool vis[N];
	void add(int x,int y,int z,int c){
		cnt++;
		a[cnt].nxt=head[x];
		a[cnt].to=y;
		a[cnt].w=z;
		a[cnt].cost=c;
		head[x]=cnt;
	}
	void new_add(int x,int y,int z,int c){
		add(x,y,z,c);
		add(y,x,0,-c);
	}
	bool spfa(){
		for(int i=1;i<=m;i++) dis[i]=dinic[i]=V,vis[i]=0;
		queue<int>q;
		vis[S]=1;
		q.push(S);
		dis[S]=0;
		while(!q.empty()){
			int now=q.front();
			q.pop();
			vis[now]=0;
			for(int i=head[now];i;i=a[i].nxt){
				int u=a[i].to;
				if(a[i].w&&dis[u]>dis[now]+a[i].cost){
					dis[u]=dis[now]+a[i].cost,pre[u]=now,e[u]=i,dinic[u]=min(dinic[now],a[i].w);
					if(!vis[u]){
						vis[u]=1;
						q.push(u);
					}
				}
			}
		}
		return dis[T]!=V;
	}
	void mcmf(){
		while(spfa()){
			int p=T;
			ans+=dis[T]*dinic[T];
			while(p!=S){
				a[e[p]].w-=dinic[T];
				a[e[p]^1].w+=dinic[T];
				p=pre[p];
			}
		}
	}
}
using namespace MCMF;
int calc(int x,int y){
	return (x-1)*n+y;
}
int main(){
	n=R(),k=R(),oilcost=R(),drivecost=R(),buildcost=R(),S=(k+1)*n*n+1,T=m=(k+1)*n*n+2;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)	
			b[i][j]=R();
	for(int i=0;i<=k;i++){
		for(int x=1;x<=n;x++){
			for(int y=1;y<=n;y++){
				if(b[x][y]) new_add(i*n*n+calc(x,y),calc(x,y),1,oilcost);
				else new_add(i*n*n+calc(x,y),calc(x,y),1,oilcost+buildcost);
				if(i!=k){
					if(y+1<=n) new_add(i*n*n+calc(x,y),(i+1)*n*n+calc(x,y+1),1,0);
					if(x+1<=n) new_add(i*n*n+calc(x,y),(i+1)*n*n+calc(x+1,y),1,0);
					if(y-1>=1) new_add(i*n*n+calc(x,y),(i+1)*n*n+calc(x,y-1),1,drivecost);
					if(x-1>=1) new_add(i*n*n+calc(x,y),(i+1)*n*n+calc(x-1,y),1,drivecost);
				}
			}
		}
		new_add((i+1)*n*n,T,1,0);
	}
	new_add(S,1,1,0);
	mcmf();
	write(ans);
}

2022/10/11 18:00
加载中...