最小费用最大流基础模板(洛谷3381)
来源:互联网 发布:虚拟屏幕软件 编辑:程序博客网 时间:2024/06/14 13:03
如题,给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用。
输入格式:
第一行包含四个正整数N、M、S、T,分别表示点的个数、有向P3381 【模板】最小费用最大流边的个数、源点序号、汇点序号。
接下来M行每行包含四个正整数ui、vi、wi、fi,表示第i条有向边从ui出发,到达vi,边权为wi(即该边最大流量为wi),单位流量的费用为fi。
输出格式:
一行,包含两个整数,依次为最大流量和在最大流量情况下的最小费用。
输入样例#1:
4 5 4 34 2 30 24 3 20 32 3 20 12 1 30 91 3 40 5
输出样例#1:
50 280
讲一下具体的思路吧:
首先用前向星储存所有的边,并且将反向边的花费设为相反数(反着流肯定减少),并且此时的流量应为0。
跑一遍spfa(因为有负权边,不能用dij),记得加slf优化,优化的效果十分的明显,将所经过的点和边分别用两个数组记录下来。
然后进入求允许通过的最大流,该边减去最大流,则反向边要加上最大流。
放上啰嗦的代码~
#include<bits/stdc++.h>#define inf 1e8#define maxn 12000#define maxm 120000using namespace std;struct Edge{ int to,next,w,cost,from;};struct Edge edge[maxm];int head[maxn],dis[maxn];int n,m,s,t;int book[maxn],pree[maxn],prep[maxn]; int ans_cost=0,ans_flow=0;int cnt=0;void add(int u,int v,int w,int cost){ edge[cnt].to=v; edge[cnt].from=u; edge[cnt].next=head[u]; edge[cnt].cost=cost; edge[cnt].w=w; head[u]=cnt++;}int spfa(){ deque<int> q; memset(prep,0,sizeof(prep)); memset(pree,0,sizeof(pree)); for(int i=1;i<=n;i++) dis[i]=inf; memset(book,0,sizeof(book)); q.push_back(s); dis[s]=0; book[s]=1; while(!q.empty()) { int j=q.front();q.pop_front(); for(int i=head[j];~i;i=edge[i].next) { int v=edge[i].to; if(dis[v]>dis[j]+edge[i].cost&&edge[i].w) { dis[v]=dis[j]+edge[i].cost; prep[v]=j;//存前一个点的标号 pree[v]=i;//存前一条边的标号 if(!book[v])//注意book数组的位置orzSA {book[v]=1;if(q.empty()||dis[v]<dis[q.front()]) q.push_front(v); else q.push_back(v); } }}book[j]=0; } if(dis[t]<inf) return 1; return 0;}void maxflow(){ int F=inf; for(int i=t;i!=s;i=prep[i])//根据点的情况推算出边的情况orzSA F=min(F,edge[pree[i]].w); for(int i=t;i!=s;i=prep[i]) { int x=pree[i];edge[x].w-=F; edge[x^1].w+=F; ans_cost+=edge[x].cost*F; } ans_flow+=F; }int main(){ ios::sync_with_stdio(false); memset(head,-1,sizeof(head));//边表设为0不能用i,orzSA cin>>n>>m>>s>>t;int u,v,w,tt;for(int i=1;i<=m;i++){ cin>>u>>v>>w>>tt; add(u,v,w,tt); add(v,u,0,-tt);}while(spfa()) maxflow(); cout<<ans_flow<<" "<<ans_cost<<endl; return 0;}
Tips:数组的大小一定要开组,存边的一定要大于2倍(反向边)。
最后感谢(orz) SA大神的帮助。
阅读全文
0 0
- 最小费用最大流基础模板(洛谷3381)
- 【洛谷】3381 【模板】最小费用最大流
- 洛谷P3381【模板】最小费用最大流
- (洛谷 最小费用最大流 模板)
- 模板[最小费用最大流]
- 最小费用最大流模板
- 最小费用最大流模板
- 最小费用最大流模板
- 最小费用最大流,模板
- 最小费用最大流模板
- 最小费用最大流 模板
- 最小费用最大流模板
- 最小费用最大流模板
- 最小费用最大流模板
- 最小费用最大流模板
- 最小费用最大流模板
- 最小费用最大流模板
- 最小费用最大流模板
- 网络最大流 EK算法
- 网络最大流 dinic算法
- 二分图匹配匈牙利算法([ZJOI2009]假期的宿舍)
- isap算法网络最大流
- FILTER&MAP
- 最小费用最大流基础模板(洛谷3381)
- HDU-1061-Rightmost Digit
- 2017 Multi-University Training Contest
- spfa+dp(洛谷1144 最短路计数)
- 并查集的离线搜索([JSOI2008]星球大战)
- hdu 6038
- 堆or优先队列(洛谷1801 黑匣子_NOI导刊2010提高(06))
- Python 模块搜索路径
- 求全排列的数学方法(洛谷1088 火星人noip2004普及组第4题)