【模板】 最小费用最大流

 1 #include<queue>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<iostream>
 5 #define MAXN 500010
 6
 7 using namespace std;
 8
 9 int n,m,s,t,ans1,ans2;
10
11 int pre[MAXN],fee[MAXN];
12
13 struct node {
14     int to;
15     int next;
16     int val;
17     int cost;
18 };
19 node e[MAXN];
20
21 int head[MAXN],tot=1;
22
23 bool vis[MAXN];
24
25 const int INF=0x7fffffff;
26
27 queue<int> q;
28
29 inline void read(int&x) {
30     int f=1;x=0;char c=getchar();
31     while(c>‘9‘||c<‘0‘) {if(c==‘-‘) f=-1;c=getchar();}
32     while(c>=‘0‘&&c<=‘9‘) {x=(x<<1)+(x<<3)+c-48;c=getchar();}
33     x=x*f;
34 }
35
36 inline void add(int x,int y,int val,int cost) {
37     e[++tot].to=y;
38     e[tot].cost=cost;
39     e[tot].val=val;
40     e[tot].next=head[x];
41     head[x]=tot;
42 }
43
44 inline void add_edge(int x,int y,int val,int cost) {
45     add(x,y,val,cost);
46     add(y,x,0,-cost);
47 }
48
49 inline int max_flow() {
50     int flow=INF;
51     for(int i=pre[t];i;i=pre[e[i^1].to])
52       flow=min(flow,e[i].val);
53     for(int i=pre[t];i;i=pre[e[i^1].to])
54       e[i].val-=flow,e[i^1].val+=flow;
55     return flow;
56 }
57
58 inline bool spfa() {
59     for(int i=1;i<=n;i++) vis[i]=false,pre[i]=-1,fee[i]=INF;
60     while(!q.empty()) q.pop();
61     fee[s]=0;
62     vis[s]=true;
63     pre[s]=0;
64     q.push(s);
65     while(!q.empty()) {
66         int u=q.front();
67         q.pop();
68         vis[u]=false;
69         for(int i=head[u];i!=-1;i=e[i].next) {
70             int to=e[i].to;
71             if(fee[u]+e[i].cost<fee[to]&&e[i].val) {
72                 fee[to]=fee[u]+e[i].cost;
73                 pre[to]=i;
74                 if(!vis[to]) {
75                     q.push(to);
76                     vis[to]=true;
77                 }
78             }
79         }
80     }
81     return fee[t]!=INF;
82 }
83
84 int main() {
85     int x,y,val,cost;
86     read(n);read(m);read(s);read(t);
87     memset(head,-1,sizeof head);
88     for(int i=1;i<=m;i++) {
89         read(x);read(y);read(val);read(cost);
90         add_edge(x,y,val,cost);
91     }
92     while(spfa()) {
93         int tt=max_flow();
94         ans1+=tt;
95           ans2+=tt*fee[t];
96     }
97     printf("%d %d\n",ans1,ans2);
98     return 0;
99 }

代码

时间: 2025-01-02 18:59:01

【模板】 最小费用最大流的相关文章

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

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

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

POJ2135Farm Tour(最小费用最大流模板)

题目链接:http://poj.org/problem?id=2135 题意:农场主想从1到n,然后从n到1,每条边最多走一次,不能走重复的路,问最短距离是多少. 建图:取超级源点s,并与房子连一条边,容量为2,费用为0:取barn与超级汇点 t 的边的容量为2,费用为0 房子与barn的费用为距离,容量为1 #include <iostream> #include <cstdlib> #include <cstdio> #include <cstring>

HDU 1533--Going Home【最小费用最大流 &amp;&amp; 模板】

Going Home Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3452    Accepted Submission(s): 1771 Problem Description On a grid map there are n little men and n houses. In each unit time, every

[洛谷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())

Doctor NiGONiGO’s multi-core CPU(最小费用最大流模板)

题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=693 题意:有一个 k 核的处理器和 n 个工作,全部的工作都须要在一个核上处理一个单位的时间,每一个核在不同一时候间处理同一个工作的花费是递增的,每一个核一次仅仅能处理一个工作,求运用k个核处理这n个工作的最小花费. 分析: 分析可知,求处理全部工作的最小花费,而每次选择怎么处理我们能够通过容量都为1的边来让网络流处理,这样就转化为最小费用最大流. 首先设一个超级源点s,连接全部的工作

POJ2135 最小费用最大流模板题

练练最小费用最大流 此外此题也是一经典图论题 题意:找出两条从s到t的不同的路径,距离最短. 要注意:这里是无向边,要变成两条有向边 #include <cstdio> #include <cstring> #define MAXN 1005 #define MAXM 10005 #define INF 0x3f3f3f3f struct Edge { int y,c,w,ne;//c容量 w费用 }e[MAXM*4]; int n,m,x,y,w; int s,t,Maxflow

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

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