模板已通过,求助网络流小变形
查看原帖
模板已通过,求助网络流小变形
387009
wangbinfeng楼主2023/12/22 20:32

RT,代码求调

//【模板】最小费用最大流 
#include<bits/stdc++.h>
using namespace std;
#if true
#define USE_QUEUE
#endif
#define int long long
const int inf=0x7fffffffffffff;
inline int read(){
	int x=0,f=1;
	char c;
	for(c=getchar();c<'0'||c>'9';c=getchar())if(c=='-')f=-f;
	for(;c>='0'&&c<='9';c=getchar())x=(x<<3)+(x<<1)+(c^48);
	return x*f;
}
class edge{
public:
    int to,pri,flw;
    edge*next,*fb;//fb=反边
    edge(int to,edge *next,int flw=1,int pri=0):next(next),to(to),flw(flw),pri(pri){}
};
class node{
public:
	int dis,flw;
	bool vis,vst;
    edge *e,*cur; //cur:当前弧,以便优化使用
    node():e(nullptr),cur(nullptr),dis(inf),vis(false),vst(false){}
    edge *add(int to,int flw=1,int pri=0){return e=new edge(to,e,flw,pri);}
}dat[500009];
//unordered_map<int,node>dat;
#ifdef USE_QUEUE
queue<int> q;
#else 
stack<int> q;
#endif
int n,m,s,t,u,v,w,c,ans,flow,cost;
inline bool spfa(){
	while(!q.empty())q.pop();
	for(int i=1;i<=t;i++)dat[i].dis=inf,dat[i].cur=dat[i].e;
	q.push(s),dat[s].dis=0,dat[s].vis=true;
	for(int now;!q.empty();){
#ifdef USE_QUEUE
		now=q.front();
#else
		now=q.top();
#endif
		q.pop(),dat[now].vis=false;
		for(edge *p=dat[now].e;p!=nullptr;p=p->next){
			if(p->flw>0 && (dat[p->to].dis>dat[now].dis+p->pri)){
				dat[p->to].dis=dat[now].dis+p->pri;
				//dat[p->to].cur=p;
				if(!dat[p->to].vis)dat[p->to].vis=true,q.push(p->to);
			}
		}	
	} 
	return dat[t].dis<inf;
}
inline int dfs(int now,int sum){
	if(now==t)return sum;
	dat[now].vst=true;
	int used=0,tmp; 
	for(edge*p=dat[now].cur;p!=nullptr;p=p->next){
		dat[now].cur=p; 
		if(p->flw>0&&dat[p->to].dis==dat[now].dis+p->pri&&(!dat[p->to].vst||t==p->to)&&(tmp=dfs(p->to,min(p->flw,sum-used)))){
			p->flw-=tmp,p->fb->flw+=tmp;
			cost+=tmp*p->pri,used+=tmp;
			if(used>=sum)break;
		} 
	} 
	dat[now].vst=false;
	return used;
}
inline void add(int u,int v,int w=1,int c=0){
    dat[u].add(v,w,c),dat[v].add(u,0,-c);
	dat[u].e->fb=dat[v].e,dat[v].e->fb=dat[u].e;
	//注意反边,其边权初值应当为0 
}
inline void dinic(){
	while(spfa())
		flow+=dfs(s,inf);
}
int p,f,nn,ss;
signed main(){
    n=read(),s=0,t=n+n+1;
	for(int i=1;i<=n;i++)p=read(),add(s,i,p),add(i+n,t,p);
	p=read(),m=read(),f=read(),nn=read(),ss=read();
	for(int i=1;i<=n;i++){
		if(i+1<=n)add(i,i+1,inf);
		if(i+m<=n)add(i,i+n+m,inf,f);
		if(i+nn<=n)add(i,i+n+nn,inf,ss);
		add(s,i+n,inf>>5,p);
	}
    dinic();
    printf("%lld",cost);
}
2023/12/22 20:32
加载中...