[洛谷3381]【模板】最小费用最大流

思路:
最小费用最大流模板题。
用EdmondsKarp,增广时使用SPFA求最短路。

 1 #include<queue>
 2 #include<cstdio>
 3 #include<cctype>
 4 #include<cstring>
 5 inline int getint() {
 6     char ch;
 7     while(!isdigit(ch=getchar()));
 8     int x=ch^‘0‘;
 9     while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^‘0‘);
10     return x;
11 }
12 const int E=100000,V=5001;
13 const int inf=0x7fffffff;
14 struct Edge {
15     int from,to,remain,cost;
16 };
17 Edge e[E];
18 int g[V][V]={0};
19 int sz=0;
20 inline void add_edge(const int u,const int v,const int w,const int f) {
21     e[sz]=(Edge){u,v,w,f};
22     g[u][++g[u][0]]=sz;
23     sz++;
24 }
25 int n,m,s,t;
26 int a[V],p[V],d[V];
27 bool inq[V];
28 inline int Augment() {
29     memset(a,0,sizeof a);
30     a[s]=inf;
31     std::queue<int> q;
32     q.push(s);
33     memset(inq,0,sizeof inq);
34     inq[s]=true;
35     for(int i=1;i<=n;i++) {
36         d[i]=(i==s)?0:inf;
37     }
38     while(!q.empty()) {
39         int x=q.front();
40         q.pop();
41         inq[x]=false;
42         for(int i=1;i<=g[x][0];i++) {
43             Edge &y=e[g[x][i]];
44             if(y.remain&&(d[x]+y.cost<d[y.to])) {
45                 p[y.to]=g[x][i];
46                 a[y.to]=std::min(a[x],y.remain);
47                 d[y.to]=d[x]+y.cost;
48                 if(!inq[y.to]) {
49                     q.push(y.to);
50                     inq[y.to]=true;
51                 }
52             }
53         }
54     }
55     return a[t];
56 }
57 inline std::pair<int,int> EdmondsKarp() {
58     int maxflow=0,mincost=0;
59     while(int flow=Augment()) {
60         for(int i=t;i!=s;i=e[p[i]].from) {
61             e[p[i]].remain-=flow;
62             e[p[i]^1].remain+=flow;
63         }
64         maxflow+=flow;
65         mincost+=d[t]*flow;
66     }
67     return std::make_pair(maxflow,mincost);
68 }
69 int main() {
70     n=getint(),m=getint(),s=getint(),t=getint();
71     while(m--) {
72         int u=getint(),v=getint(),w=getint(),f=getint();
73         add_edge(u,v,w,f);
74         add_edge(v,u,0,-f);
75     }
76     std::pair<int,int> MCMF=EdmondsKarp();
77     printf("%d %d\n",MCMF.first,MCMF.second);
78     return 0;
79 }
时间: 2024-10-12 19:49:17

[洛谷3381]【模板】最小费用最大流的相关文章

最小费用最大流基础模板(洛谷3381)

如题,给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用. 输入格式: 第一行包含四个正整数N.M.S.T,分别表示点的个数.有向P3381 [模板]最小费用最大流边的个数.源点序号.汇点序号. 接下来M行每行包含四个正整数ui.vi.wi.fi,表示第i条有向边从ui出发,到达vi,边权为wi(即该边最大流量为wi),单位流量的费用为fi. 输出格式: 一行,包含两个整数,依次为最大流量和在最大流量情况下的最小费用. 输入样例#1:

[洛谷P3381]【模板】最小费用最大流

题目大意:给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用. 解题思路:最小费用最大流模板.虽说此题最后两个点的时限是1200ms,但我觉得耗时在1000ms以上很不爽,于是对代码进行全面优化.然而最后一个点仍然有1050+ms.最后逼我开大招(代码第一行),瞬间只有不到900ms,大爽. C++ Code: %:pragma GCC optimize("Ofast") #include<cstdio> #in

洛谷 P3381 【模板】最小费用最大流

题目描述 如题,给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用. 输入输出格式 输入格式: 第一行包含四个正整数N.M.S.T,分别表示点的个数.有向边的个数.源点序号.汇点序号. 接下来M行每行包含四个正整数ui.vi.wi.fi,表示第i条有向边从ui出发,到达vi,边权为wi(即该边最大流量为wi),单位流量的费用为fi. 输出格式: 一行,包含两个整数,依次为最大流量和在最大流量情况下的最小费用. 输入输出样例 输入样例#

洛谷 P4009 汽车加油行驶问题 【最小费用最大流】

分层图,建k层,设(i,j,0)为点(i,j)的满油状态,全图的流量都是1,因为重复走到一个点没有意义.如果当前点是加油站,那么它向它上左的点连费用为a的边,向下右连费用为a+b的边: 否则,这个点的所有层向零层连费用为a+c的边表示建加油站和加油,其他的当前点是加油站的情况连即可,但是不用加a.然后s向(1,1,0)连,(n,n)的所有层向t连,最后跑最小费用最大流. #include<iostream> #include<cstdio> #include<cmath>

洛谷 P4015 运输问题 【最小费用最大流+最大费用最大流】

s向仓库i连ins(s,i,a[i],0),商店向t连ins(i+m,t,b[i],0),商店和仓库之间连ins(i,j+m,inf,c[i][j]).建两次图分别跑最小费用最大流和最大费用最大流即可. #include<iostream> #include<cstdio> #include<queue> #include<cstring> using namespace std; const int N=1000005,inf=1e9; int n,m,h

洛谷 P4014 分配问题 【最小费用最大流+最大费用最大流】

其实KM更快--但是这道题不卡,所以用了简单粗暴的费用流,建图非常简单,s向所有人连流量为1费用为0的边来限制流量,所有工作向t连流量为1费用为0的边,然后对应的人和工作连(i,j,1,cij),跑一遍最小费用最大流再跑一遍最大费用最大流即可.方便起见直接重建图了. #include<iostream> #include<cstdio> #include<queue> #include<cstring> using namespace std; const

P3381 【模板】最小费用最大流

P3381 [模板]最小费用最大流 题目描述 如题,给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用. 输入输出格式 输入格式: 第一行包含四个正整数N.M.S.T,分别表示点的个数.有向边的个数.源点序号.汇点序号. 接下来M行每行包含四个正整数ui.vi.wi.fi,表示第i条有向边从ui出发,到达vi,边权为wi(即该边最大流量为wi),单位流量的费用为fi. 输出格式: 一行,包含两个整数,依次为最大流量和在最大流量情况下的

poj 2195 最小费用最大流模板

/*Source Code Problem: 2195 User: HEU_daoguang Memory: 1172K Time: 94MS Language: G++ Result: Accepted Source Code */ #include <iostream> #include <stdio.h> #include <queue> #include <math.h> #include <string.h> using namespa

poj2135最小费用最大流经典模板题

Farm Tour Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13509   Accepted: 5125 Description When FJ's friends visit him on the farm, he likes to show them around. His farm comprises N (1 <= N <= 1000) fields numbered 1..N, the first of