P4015 运输问题

P4015 运输问题

文章目录

    • 题目描述:
    • 输入格式:
    • 输出格式:
    • 输入输出样例:
    • 题解:
    • 代码:

题目描述:

在这里插入图片描述

输入格式:

在这里插入图片描述

输出格式:

两行分别输出最小运输费用和最大运输费用。

输入输出样例:

输入 #1

2 3
220 280
170 120 210
77 39 105
150 186 122

输出 #1

48500
69140

题解:

最小费用最大流(MCMF)问题
根据样例数据分析:
橙色为第一个仓库晕倒各零售商店的单位费用
绿色为第二个
在这里插入图片描述
一边是仓库,一边是商店,典型的二分图,还是完全二分图
我们可以在仓库的左边设置一个源点S,右边设置一个终点T。S指向每一个仓库,容量为ai,费用为0,而每一个商店指向T,容量为bi,费用为0
从仓库到商店的边容量是min(仓库货物量ai,商店容量bi),费用为读入的值
为了方便处理,我们可以将S点记为编号1,仓库为编号1 ~ m,商店为m+1 ~ n+m,T点为201
然后直接跑最小费用最大流就可以了
找到最大后,将费用取反再跑一遍即可找到最小

代码:

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<queue>
#include<stack>
#include<vector>
#include<map>
#include<set>
#include<algorithm>#define I_copy_this_answer return 0;using namespace std;int n,m,head[1100];
int cnt=1;
int mincost,maxwater;
int flow[1100];
int b[1100],cost[310][310];
int pre[1100],last[1100],dis[1100],vis[1100],a[1100];
int s=0;
//last记录边,pre记录点 
struct node{int next,to,dis,flow; 
}edge[100860]; void addedge(int next,int to,int dis,int flow)
{edge[++cnt].to=to;edge[cnt].dis=dis;edge[cnt].flow=flow;edge[cnt].next=head[next];head[next]=cnt;
}int spfa()
{memset(flow,0x3f,sizeof(flow));memset(dis,0x3f,sizeof(dis));memset(vis,0,sizeof(vis));queue <int> q;q.push(s);dis[s]=0;vis[s]=1;pre[201]=-1;  //初始化汇点的前点 while(!q.empty()){int u=q.front();q.pop();vis[u]=0;for(int i=head[u];i;i=edge[i].next){int	v=edge[i].to;int w=edge[i].dis;int l=edge[i].flow;if(dis[u]+w<dis[v]&&l>0)  //没有流量的话这条路就增广不了,最短距离是建立在增广路存在的基础上的 {dis[v]=dis[u]+w;last[v]=i;  //last指的是这个点(v)与上个点(u)相连的边的编号 pre[v]=u;  //pre指的是这条路径上这个点(v)的上一个点 flow[v]=min(flow[u],l);  //把当前边流量与上个点的流量对比,解决出现仓库货物比需要的少的情况 if(!vis[v]){q.push(v);vis[v]=1;}}}}return pre[201]!=-1;  //如果不是这个值就说明这个点被刷新,增广成功 
}void mcmf()
{while(spfa()){mincost+=dis[201]*flow[201];   //从源点出发到汇点的单位费用再乘以单位,由于每次只增广一条路,而且仓库和商店是直接连接的,可以这样写 int t=201;while(t!=0){edge[last[t]].flow-=flow[201];  //回溯,修改每条边的流量,因为该算法中途找到的增广路不是最后的增广路,所以这个要等到最后来改变 edge[last[t]^1].flow+=flow[201];t=pre[t];}}
}void build_edge(int t)//t用来控制边权的正负,为了方便求最小和最大 
{for(int i=1;i<=m;i++){addedge(0,i,0,a[i]);addedge(i,0,0,0);//与源点S相连 } for(int i=1;i<=m;i++)for(int j=1;j<=n;j++){addedge(i,j+m,cost[i][j]*t,b[j]);addedge(j+m,i,-cost[i][j]*t,0);//仓库与商店相连 }for(int i=1;i<=n;i++){addedge(i+m,201,0,b[i]);//与汇点T相连 addedge(201,i+m,0,0);}
}int main()
{int i,j;scanf("%d %d",&m,&n);for(i=1;i<=m;i++){int t1;scanf("%d",&a[i]);	}for(i=1;i<=n;i++)scanf("%d",&b[i]);for(i=1;i<=m;i++)for(j=1;j<=n;j++)scanf("%d",&cost[i][j]);  //仓库与商店的边权 build_edge(1);  //建立边权为正的边,跑最小费用最大流 mcmf();//最小费用最大流(Min Cost Max Flow )的缩写 printf("%d",mincost); maxwater=0;mincost=0; cnt=1;memset(head,0,sizeof(head));build_edge(-1);//建立边权为符的边 mcmf();printf("\n%d",-mincost);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/319921.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NetCore使用Jwtbearer给WebAPI添加访问控制

现在JWT代替session来做访问控制已经成为大部分webapi的做法&#xff0c;今天我们也来尝试一下WebAPI使用NetCore2.1创建,无身份认证信息nuget安装包IdentityModel 选择稳定版3.9.0Microsoft.AspNetCore.Authorization 版本2.1.1Microsoft.AspNetCore.Authentication.JwtBearer…

图论复习——网络流

最大流 与 最小费用最大流 Blog 有上下界网络流 Blog 最小割 Blog 模拟费用流 CF724E Goods transportation 摘自此Blog 建图优化 若同一行或者同一列的点互相可达&#xff0c;那么其实不需要两两连边&#xff0c;只需要对于每行和每列建一个辅助节点作为中转 [ARC…

【分块】区间众数(金牌导航 分块-1)

区间众数 金牌导航 分块-1 题目大意 给出一个数列&#xff0c;和若干询问&#xff0c;每个询问让你求一个区间内的众数 输入样例 6 3 1 2 3 2 1 2 1 5 3 6 1 5输出样例 1 2 1数据范围 1⩽N⩽4104,1⩽M⩽5104,1⩽ai⩽1091\leqslant N \leqslant 4\times 10^4,1\leqs…

CF235C-Cyclical Quest【SAM】

正题 题目链接:https://www.luogu.com.cn/problem/CF235C 题目大意 一个文本串sss。询问nnn个匹配的本质不同的循环同构在文本串中出现了几次。 解题思路 我们匹配完原串之后&#xff0c;相当与每次在头部删去一个字符然后又在末尾加上一个字符。使用SAMSAMSAM匹配的话&…

离散大创项目——图片识别笔记

1.我才知道ainput()读入的竟然是字符串。。。还要强制转化成int型&#xff0c;这玩意搞了我好久 2.对照片进行裁剪&#xff0c;将照片周围多余的白色部分去除&#xff08;也就是让图像尽可能撑满整个框&#xff09; 由上一张裁成下一张 from PIL import Image import os SCA…

最小割小记

参考博客&#xff1a;最小割浅谈 关于最小割 常用描述 表述一&#xff1a;删去若干条边使得源点到汇点不连通&#xff0c;求删边的权值和的最小可能值。 表述二&#xff1a;将点集分为(S,T)(S,T)(S,T)&#xff0c;记所有从SSS中出发到TTT中的边的权值和为c(S,T)c(S,T)c(S,T)&a…

CF204E-Little Elephant and Strings【广义SAM,线段树合并】

正题 题目链接:https://www.luogu.com.cn/problem/CF204E 题目大意 nnn个字符串的一个字符串集合&#xff0c;对于每个字符串求有多少个子串是这个字符串集合中至少kkk个字符串的子串。 解题思路 因为对于每个字符串我们需要维护的信息不同&#xff0c;不能累加&#xff0c;所…

【莫队】区间不同数(金牌导航 莫队-1)

区间不同数 金牌导航 莫队-1 题目大意 给出n个数&#xff0c;然后询问m次&#xff0c;每次询问一个区间内不同的数的个数 样例输入 6 1 2 3 4 3 5 3 1 2 3 5 2 6样例输出 2 2 4数据范围 1⩽n⩽5104,1⩽m⩽2105,0⩽ai⩽1061\leqslant n\leqslant 5\times 10^4,1\leqslant …

斐波那契数列求法

文章目录求斐波那切数列的几个方法&#xff1a;经典做法&#xff1a;递推&#xff1a;动态规划矩阵快速幂原理&#xff1a;代码&#xff1a;例题&#xff1a;模拟过程求斐波那切数列的几个方法&#xff1a; 经典做法&#xff1a; 众所周知&#xff1a;斐波那契数列的定义是f(…

ASP.Net Core2.1中的HttpClientFactory系列一

引言&#xff1a;ASP.NET Core2.1 中出现了一个新的 HttpClientFactory 功能, 它有助于解决开发人员在使用 HttpClient 实例从其应用程序中访问外部 web 资源时可能遇到的一些常见问题。关于HttpClientFactory 到底解决了那些HttpClient的严重问题&#xff0c;下面是我罗列出来…

欧拉回路哈密顿回路

欧拉回路 总结 百度百科 混合图的欧拉回路 Fleury算法 Hierholzer算法 //寻找无向图的欧拉路径 #include<iostream> #include<vector> #include<stack> using namespace std; vector<int> g[1001]; int n,m,x,y,d[1001],s-1,t-1; bool vis[1001][100…

【CDQ分治】三维偏序(luogu 3801/金牌导航 CDQ分治-1)

三维偏序 luogu 3801 金牌导航 CDQ分治-1 题目大意 有n个元素&#xff0c;第i个元素有ai,bi,cia_i,b_i,c_iai​,bi​,ci​三个属性&#xff0c;设 f(i)表示满足aj⩽aia_j\leqslant a_iaj​⩽ai​且bj⩽bib_j \leqslant b_ibj​⩽bi​且cj⩽cic_j \leqslant c_icj​⩽ci​且…

P4929-[模板]舞蹈链(DLX)

正题 题目链接:https://www.luogu.com.cn/problem/P4929 题目大意 n∗mn*mn∗m的矩形有0/10/10/1&#xff0c;要求选出若干行使得每一列有且仅有一个111。 解题思路 精确覆盖问题指的是一个集合SSS和它的若干个子集集合TTT&#xff0c;要求选出TTT的一个子集使得里面的集合元…

最大子矩阵(普通和01)

文章目录普通矩阵&#xff08;单个矩阵值为任何数&#xff09;最大子段和扩展到二维情况01矩阵&#xff08;单个矩阵值为0或1&#xff09;代码&#xff1a;普通矩阵&#xff08;单个矩阵值为任何数&#xff09; 例题&#xff1a;POJ 1074 求出其中最大的子矩阵 答案是&#x…

自动化流程开源框架BotSharp

BotSharp是一款为方便构建智能对话机器人平台而开发的开源框架&#xff0c;最大的特点是所有模型算法都是基于.NET Core开发实现&#xff0c;甚至最基本的Penn Treebank分词标准&#xff0c;都重新用C#实现了。在机器学习python占绝对优势的时代算是不可多得的项目。该项目涉及…

二分图匹配

定义&#xff1a; 二分图&#xff1a;一个图被分成了两部分&#xff0c;相同的部分没有边 匹配&#xff1a;二分图G的子图M中&#xff0c;M的边集{E}中的任意两条边都不指向同一个顶点 极大匹配&#xff1a;在当前已完成的匹配下,无法再通过增加未完成匹配的边的方式来增加匹…

【整体二分】区间第k小(金牌导航 整体二分-1)

区间第k小 金牌导航 整体二分-1 题目大意 给出一个序列&#xff0c;有若干查询&#xff0c;每次查询给出l,r,k&#xff0c;让你求l~r这个区间的第k大 输入样例 7 3 1 5 2 6 3 7 4 2 5 3 4 4 1 1 7 3输出样例 5 6 3数据范围 1⩽n⩽105,1⩽m⩽50000,1⩽∣ai∣⩽1091\leqsla…

积极参与开源项目,促进.NET Core生态社区发展

今天早上在微信群里聊天聊到百度的SDK 已经支持.NET Core, 百度已经在3月份就支持了&#xff0c;想起当时还是我在他们的github上提的issue&#xff1a; https://github.com/Baidu-AIP/dotnet-sdk/issues/3。.NET Core生态社区的发展已经四年多时间&#xff0c;日趋完善&#x…

P6091-[模板]原根

正题 题目链接:https://www.luogu.com.cn/problem/P6091 题目大意 给出一个数ppp&#xff0c;求出它的所有在[0,p][0,p][0,p]的原根。 解题思路 原根的定义&#xff0c;δp(a)\delta_p(a)δp​(a)表示一个最小的nnn使得an≡1(modp)a^n\equiv1(mod\ p)an≡1(mod p)&#xff0…

并查集小记

有什么用&#xff1a; 查询元素a和元素b是否属于同一组 合并元素a和元素b所在组 代码实现&#xff1a; #include<iostream> using namespace std; int n,m,p; int fa[5001]; int find(int x){if(fa[x]x) return x;else{return fa[x]find(fa[x]);} } int main(){cin&g…