zoukankan      html  css  js  c++  java
  • [洛谷P3381]【模板】最小费用最大流

    题目大意:给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用。

    解题思路:最小费用最大流模板。虽说此题最后两个点的时限是1200ms,但我觉得耗时在1000ms以上很不爽,于是对代码进行全面优化。然而最后一个点仍然有1050+ms。最后逼我开大招(代码第一行),瞬间只有不到900ms,大爽

    C++ Code:

    %:pragma GCC optimize("Ofast") 
    #include<cstdio>
    #include<cctype>
    #include<cstring>
    #define INF 0x3f3f3f3f
    #define min(a,b) (((a)<(b))?(a):(b))
    char buf[3000020];
    int bufpos,n,m,head[5005],cnt,dis[5005],pre_e[5005],a[5005];
    bool vis[5005];
    int q[30002];
    struct edges{
    	int from,to,cap,cost,nxt;
    }e[110005];
    inline void init(){
    	bufpos=0;
    	buf[fread(buf,1,3000000,stdin)]='';
    }
    inline int readint(){
    	int p=0;
    	for(;!isdigit(buf[bufpos]);bufpos++);
    	for(;isdigit(buf[bufpos]);bufpos++)
    	p=(p<<3)+(p<<1)+buf[bufpos]-'0';
    	return p;
    }
    inline void addedge(int from,int to,int cap,int cost){
    	e[++cnt].from=from;
    	e[cnt].to=to;
    	e[cnt].cap=cap;
    	e[cnt].cost=cost;
    	e[cnt].nxt=head[from];
    	head[from]=cnt;
    	e[++cnt].from=to;
    	e[cnt].to=from;
    	e[cnt].cap=0;
    	e[cnt].cost=-cost;
    	e[cnt].nxt=head[to];
    	head[to]=cnt;
    }
    bool spfa(int s,int t,int& flow,int& cost){
    	memset(dis,0x3f,sizeof dis);
    	memset(pre_e,0,sizeof pre_e);
    	memset(a,0x3f,sizeof a);
    	memset(vis,0,sizeof vis);
    	dis[s]=0;
    	vis[s]=1;
    	q[1]=s;
    	int l=0,r=1;
    	while(l!=r){
    		int u=q[l=l%30000+1];
    		vis[u]=0;
    		for(int i=head[u];i;i=e[i].nxt){
    			if(e[i].cap&&dis[e[i].to]>dis[u]+e[i].cost){
    				dis[e[i].to]=dis[u]+e[i].cost;
    				pre_e[e[i].to]=i;
    				a[e[i].to]=min(a[u],e[i].cap);
    				if(!vis[e[i].to]){
    					vis[e[i].to]=1;
    					q[r=r%30000+1]=e[i].to;
    				}
    			}
    		}
    	}
    	if(dis[t]==INF)return 0;
    	flow+=a[t];
    	cost+=dis[t]*a[t];
    	for(int i=t;i!=s;i=e[pre_e[i]].from){
    		e[pre_e[i]].cap-=a[t];
    		e[pre_e[i]^1].cap+=a[t];
    	}
    	return 1;
    }
    int main(){
    	#ifdef DEBUG
    	freopen("input.txt","r",stdin);
    	freopen("output.txt","w",stdout);
    	#endif
    	init();
    	cnt=1;
    	n=readint(),m=readint();
    	int s=readint(),t=readint();
    	for(;m--;){
    		int u=readint(),v=readint(),w=readint(),f=readint();
    		addedge(u,v,w,f);
    	}
    	int flow=0,cost=0;
    	while(spfa(s,t,flow,cost));
    	printf("%d %d
    ",flow,cost);
    	return 0;
    }
    
  • 相关阅读:
    基于 HTML5 WebGL 的 水泥工厂可视化系统
    基于 HTML5 WebGL 的楼宇智能化集成系统(二)
    基于 HTML5 WebGL 的楼宇智能化集成系统(一)
    20200601
    App上线-Unexpected CFBundleExecutable Key
    'CALayer position contains NaN: [nan nan]'异常
    shareSDK由4.2.8升级成4.3.7详解(微信sdk自动升级为1.8.6+)
    从0开始教你 swift
    20年开篇
    19再见,20你好
  • 原文地址:https://www.cnblogs.com/Mrsrz/p/7259183.html
Copyright © 2011-2022 走看看