loj 102 最小费用流

补一发费用流的代码

%%%棒神

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cstdlib>
 5 #include<cmath>
 6 #include<algorithm>
 7 #include<queue>
 8 #include<vector>
 9 #include<map>
10 #define ll long long
11 #define inf 2139062143
12 #define MAXN 420
13 using namespace std;
14 inline int read()
15 {
16     int x=0,f=1;char ch=getchar();
17     while(!isdigit(ch)) {if(ch==‘-‘) f=-1;ch=getchar();}
18     while(isdigit(ch)) x=x*10+ch-‘0‘,ch=getchar();
19     return x*f;
20 }
21 int n,m,ans;
22 struct ZKW
23 {
24     int fst[MAXN],to[MAXN*80],nxt[MAXN*80],val[MAXN*80],cos[MAXN*80],cnt;
25     int dis[MAXN],s,t,vis[MAXN];
26     ZKW() {ans=0,cnt=2;}//memset(fst,0xff,sizeof(fst));}
27     void add(int u,int v,int w,int c) {nxt[cnt]=fst[u],fst[u]=cnt,to[cnt]=v,val[cnt]=w,cos[cnt++]=c;}
28     int spfa()
29     {
30         memset(dis,127,sizeof(dis));
31         queue<int> q;
32         dis[t]=0,vis[t]=1;
33         q.push(t);
34         while(!q.empty())
35         {
36             int x=q.front();q.pop();vis[x]=0;
37             for(int i=fst[x];i;i=nxt[i])
38                 if(val[i^1]&&dis[to[i]]>dis[x]-cos[i])
39                 {
40                     dis[to[i]]=dis[x]-cos[i];
41                     if(!vis[to[i]]) {q.push(to[i]);vis[to[i]]=1;}
42                 }
43         }
44         memset(vis,0,sizeof(vis));
45         return dis[s]!=inf;
46     }
47     int dfs(int x,int a)
48     {
49         if(x==t||!a) {ans+=dis[s]*a;return a;}
50         if(vis[x])return 0;
51         vis[x]=1;
52         int res=0,f;
53         for(int i=fst[x];i&&a;i=nxt[i])
54             if(dis[to[i]]==dis[x]-cos[i]&&(f=dfs(to[i],min(a,val[i]))))
55                 res+=f,val[i]-=f,val[i^1]+=f,a-=f;
56         vis[x]=0;
57         return res;
58     }
59     int solve()
60     {
61         int f=0;
62         while(spfa()) f+=dfs(s,2147483647);
63         return f;
64     }
65 }Z;
66 int main()
67 {
68     n=read(),m=read();int a,b,c,d;
69     while(m--)
70     {
71         a=read(),b=read(),c=read(),d=read();
72         Z.add(a,b,c,d);
73         Z.add(b,a,0,-d);
74     }
75     Z.s=1,Z.t=n;
76     printf("%d ",Z.solve());
77     printf("%d",ans);
78 }

原文地址:https://www.cnblogs.com/yyc-jack-0920/p/8414193.html

时间: 2024-08-11 21:31:17

loj 102 最小费用流的相关文章

LibreOJ #102. 最小费用流

二次联通门 : LibreOJ #102. 最小费用流 /* LibreOJ #102. 最小费用流 Spfa跑花费 记录路径 倒推回去 */ #include <cstring> #include <cstdio> #include <queue> #define Max 10000 void read (int &now) { now = 0; register char word = getchar (); while (word > '9' ||

网络流模板大全

说"大全",其实也不见得全... 1.最大流,Dinic 模板.[LOJ#101] 这题 Dinic 需要卡常才能过,主要是 BFS 从汇点开始搜更快. #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <cctype> #include <algorithm> using namespace s

FZU2143Board Game(最小费用流)

题目大意是说有一个B矩阵,现在A是一个空矩阵(每个元素都为0),每次操作可以将A矩阵相邻的两个元素同时+1,但是有个要求就是A矩阵的每个元素都不可以超过K,求 这个的最小值 解题思路是这样的,新建起点与奇点(i != j)连K条边,第i条边的权值为(i - B)^2 - (i - 1 - B)^2 = 2 * i - 1 - 2 * B(这样可以保证如果此边的流量为a, 花费始终是(a-b)^2);另外新建终点与偶点相连,代价与上诉一致: 然后跑一遍最小费用流,知道cost>=0时为止.祥见代码

UVa 1658 (拆点法 最小费用流) Admiral

题意: 给出一个有向带权图,求从起点到终点的两条不相交路径使得权值和最小. 分析: 第一次听到“拆点法”这个名词. 把除起点和终点以外的点拆成两个点i和i',然后在这两点之间连一条容量为1,费用为0的边.这样就保证了每个点最多经过一次. 其他有向边的容量也是1 然后求从起点到终点的流量为2(这样就保证了是两条路径)的最小费用流. 本来要在加一个源点和汇点来限制流量的,但是这样弧就多了很多.lrj代码中用了很巧妙的方法,避免了这个问题. 1 #include <bits/stdc++.h> 2

POJ 2516:Minimum Cost(最小费用流)

https://vjudge.net/problem/11079/origin 题意:有N个商店和M个供应商和K种物品,每个商店每种物品有一个需求数,每个供应商每种物品有一个供应量,供应商到商店之间的运输需要花费,如果供不应求输出-1,否则输出最小花费. 思路:比较明显的最小费用流.想法大概都是源点和供应商连一条容量为供应量,花费为0的边,商店和汇点之间连一条容量为需求量,花费为0的边,供应商和商店之间连一条容量为INF,花费为题意给出的花费的边.建图的话一开始是直接对于每一个商店每一种物品和每

(最小费用流)hdu 6118(2017百度之星初赛B 1005) 度度熊的交易计划

度度熊的交易计划 Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 260    Accepted Submission(s): 83 Problem Description 度度熊参与了喵哈哈村的商业大会,但是这次商业大会遇到了一个难题: 喵哈哈村以及周围的村庄可以看做是一共由n个片区,m条公路组成的地区. 由于生产能力的区别,第i个片

POJ 2195 Going Home 最小费用流 裸题

给出一个n*m的图,其中m是人,H是房子,.是空地,满足人的个数等于房子数. 现在让每个人都选择一个房子住,每个人只能住一间,每一间只能住一个人. 每个人可以向4个方向移动,每移动一步需要1$,问所有人移动到房子里的最少花费. 其中,n,m<=100,最多有100个人. 最小给用流裸题. 建立一个超级源点,跟每一个房子连一条边,容量为1,花费为0 每一个人与超级汇点连一条边,容量为1,花费为0 一个房子与每一个人建一条边,房子指向人,容量为1,花费用2者的距离(不是直线距离) 然后跑最小费用流算

【HDOJ6118】度度熊的交易计划(最小费用流)

题意: 度度熊参与了喵哈哈村的商业大会,但是这次商业大会遇到了一个难题: 喵哈哈村以及周围的村庄可以看做是一共由n个片区,m条公路组成的地区. 由于生产能力的区别,第i个片区能够花费a[i]元生产1个商品,但是最多生产b[i]个. 同样的,由于每个片区的购买能力的区别,第i个片区也能够以c[i]的价格出售最多d[i]个物品. 由于这些因素,度度熊觉得只有合理的调动物品,才能获得最大的利益. 据测算,每一个商品运输1公里,将会花费1元. 那么喵哈哈村最多能够实现多少盈利呢? 1<=n<=500,

最小费用流 poj2195

Going Home Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 17955   Accepted: 9145 Description On a grid map there are n little men and n houses. In each unit time, every little man can move one unit step, either horizontally, or vertical