P1251费用瘤 求大佬查错
查看原帖
P1251费用瘤 求大佬查错
469066
zzxLLL楼主2022/1/19 20:35

样例过不去 输出95 调吐了已经

#include<queue>
#include<cstdio>
#include<cstring>
using namespace std;
const int M=4010;
const int inf=2147483647;

struct node{
	int to,next,flow,cost;
}edge[M<<1];
int head[M],cnte=1;
void add(int u,int v,int w,int c){
	edge[++cnte].to=v;
	edge[cnte].flow=w;
	edge[cnte].cost=c;
	edge[cnte].next=head[u];
	head[u]=cnte;
	
	edge[++cnte].to=u;
	edge[cnte].flow=0;
	edge[cnte].cost=-c;
	edge[cnte].next=head[v];
	head[v]=cnte;
}

int n,s,t,Wnew,Tfast,Wfast,Tslow,Wslow;
int dis[M],incf[M],pre[M];
bool vis[M];
bool SPFA(){
	for(int i=0;i<M;i++) dis[i]=inf;
	for(int i=0;i<M;i++) vis[i]=false;
	queue<int>q;q.push(s);
	dis[s]=0,vis[s]=true;
	incf[s]=inf;
	while(!q.empty()){
		int u=q.front();q.pop();
		vis[u]=false;
		for(int i=head[u];~i;i=edge[i].next){
			if(edge[i].flow<=0) continue;
			int v=edge[i].to;
			if(dis[v]>dis[u]+edge[i].cost){
				pre[v]=i;
				dis[v]=dis[u]+edge[i].cost;
				incf[v]=min(incf[u],edge[i].flow);
				if(!vis[v]){
					vis[v]=true;
					q.push(v);
				}
			}
		}
	}
	if(dis[t]==inf) return false;
	return true;
}

int MCMF(){
	int mincost=0;
	while(SPFA()){
		mincost+=dis[t]*incf[t];
		int cur=t;
		while(cur!=s){
			int i=pre[cur];
			edge[i].flow-=incf[t],edge[i^1].flow+=incf[t];
			cur=edge[i^1].to;
		}
	}
	return mincost;
}

int a[M];
int main(){
	memset(head,-1,sizeof head);
	scanf("%d",&n),s=0,t=(n<<1)+1;
	for(int i=1,x;i<=n;i++){
		scanf("%d",&x);
		add(s,i,x,0),add(i+n,t,x,0);
	}
	scanf("%d%d%d%d%d",&Wnew,&Wfast,&Tfast,&Wslow,&Tslow);
	for(int i=1;i<=n;i++){
		add(s,i+n,inf,Wnew);
		if(i+1<=n) add(i,i+1,inf,0);
		if(i+Tfast<=n) add(i,i+Tfast+n,inf,Wfast);
		if(i+Tslow<=n) add(i,i+Tslow+n,inf,Wslow);
	}
	printf("%d",MCMF());
	return 0;
}
2022/1/19 20:35
加载中...