POJ 2516 Minimum Cost 费用流

C++(Qt)软件调试---静态分析工具clang-tidy(18) 现在很多人在开发中完全忽略了编译器、IDE的警告提示,这怎么可能写出稳定的程序。 clang-tidy是一个由LLVM项目提供的开源工具,是一个静态分析工具,用于进行静态代码分析和代码质量改进。 阅读详情

就是说有N个商人,和M个货源,然后一共是K种商品

输入第一行是N M K

接下来是N行,每行K个,表示商人对各种商品的需求情况,需求数都在[0,3]内

再接下来是M行,每行K个,表示货源中每种商品的供应情况,供应书也在[0,3]内

再接下来是K个N*M的矩阵,第x个矩阵的第y行第z列表示第x种商品从第z个货源运输到第y个商人那里需要多少花费(1个的花费)

然后问你现在想完成从货源到商人的运输,问商人们能否得到他们想要的那么多的货物,不能就输出-1,能就输出最小总花费


嗯,第一次写费用流,费好大力气读懂题之后,感觉像二分图啊,从货源到商人,但是边太多了,二分图没法做啊,不过其实图也类似于一个二分图,但是还是当普通图来对待,跑费用流,

然后,货物好多啊,怎么办,连重边的话,怎么区分呢?后来看网上的说法是对每种商品都跑一次费用流,不知道整体上一次跑的话该怎么跑

好,然后对于每种商品,先建一个超级源点,连接每个货源,容量就是这个货源的商品数,花费呢,就是0,先把货源商品数给约束了,然后建个超级汇点,连接每个商人,容量,就是商人的所需商品数,保证最后得到的商品数不会超过所以商人的所需数量,然后中间货源到商人建边,容量就为无穷,因为在超级源点和超级汇点那里已经约束了,费用就是对应的费用

呃,当然,还有判断能否提供商人所需的数量,可以在跑费用流时跑出来,但其实可以提前算出来,因为每个货源都可以给所有商人供货,所以如果货源的总商品数<商人的总需求数,肯定就是不可以,直接就是-1即可,否则就肯定能满足

然后跑k次费用流,算出答案即可


#include <string>
#include <iostream>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
#include <vector>
#include <fstream>
#include <queue>
using namespace std;
#define ll long long
#define INF 0x3f3f3f3f
#define maxn 10005
#define maxm 100005
//最小费用最大流,求最大费用只需要取相反数,结果取相反数即可。
//点的总数为 N,点的编号[0,N-1]
struct Edge
{
	int to, next, cap, flow, cost;
}edge[maxm];
int head[maxn], tol;
int pre[maxn], dist[maxn];
bool vis[maxn];
int N;//节点总个数,节点编号从0~N-1
void init(int n)
{
	N = n;
	tol = 0;
	memset(head, -1, sizeof(int)*maxn);
}
void addedge(int u, int v, int cap, int cost)
{
	edge[tol].to = v;
	edge[tol].cap = cap;
	edge[tol].cost = cost;
	edge[tol].flow = 0;
	edge[tol].next = head[u];
	head[u] = tol++;
	edge[tol].to = u;
	edge[tol].cap = 0;
	edge[tol].cost = -cost;
	edge[tol].flow = 0;
	edge[tol].next = head[v];
	head[v] = tol++;
}
bool spfa(int s, int t)
{
	queue<int>q;
	memset(dist, 0x3f, sizeof(int)*maxn);
	memset(vis, 0, sizeof(vis));
	memset(pre, -1, sizeof(int)*maxn);
	dist[s] = 0;
	vis[s] = true;
	q.push(s);
	while (!q.empty())
	{
		int u = q.front();
		q.pop();
		vis[u] = false;
		for (int i = head[u]; i != -1; i = edge[i].next)
		{
			int v = edge[i].to;
			if (edge[i].cap > edge[i].flow &&
				dist[v] > dist[u] + edge[i].cost)
			{
				dist[v] = dist[u] + edge[i].cost;
				pre[v] = i;
				if (!vis[v])
				{
					vis[v] = true;
					q.push(v);
				}
			}
		}
	}
	if (pre[t] == -1)return false;
	else return true;
}
//返回的是最大流,cost存的是最小费用
int minCostMaxflow(int s, int t, int &cost)
{
	int flow = 0;
	cost = 0;
	while (spfa(s, t))
	{
		int Min = INF;
		for (int i = pre[t]; i != -1; i = pre[edge[i ^ 1].to])
		{
			if (Min > edge[i].cap - edge[i].flow)
				Min = edge[i].cap - edge[i].flow;
		}
		for (int i = pre[t]; i != -1; i = pre[edge[i ^ 1].to])
		{
			edge[i].flow += Min;
			edge[i ^ 1].flow -= Min;
			cost += edge[i].cost * Min;
		}
		flow += Min;
	}
	return flow;
}
int shop[55][55], place[55][55], goods[55][55][55];
int main()
{
	//freopen("input.txt","r",stdin);
	//freopen("output.txt","w",stdout);
	//ios::sync_with_stdio(false);
	//cin.tie(0); cout.tie(0);
	//ifstream in;
	//in.open("input.txt", ios::in);
	int n, m, k;
	while (scanf("%d%d%d", &n, &m, &k) != EOF)
	{
		if (n == 0 && m == 0 && k == 0)
			break;
		int ans = 0, sum = 0;
		int t1 = 0, t2 = 0;
		for (int i = 0; i < n; ++i)
		{
			for (int j = 0; j < k; ++j)
				scanf("%d", &shop[i][j]);
		}
		for (int i = 0; i < m; ++i)
		{
			for (int j = 0; j < k; ++j)
				scanf("%d", &place[i][j]);
		}
		for (int x = 0; x < k; ++x)
		{
			for (int i = 0; i < n; ++i)
			{
				for (int j = 0; j < m; ++j)
					scanf("%d", &goods[x][i][j]);
			}
		}
		for (int x = 0; x < k; ++x)
		{
			init(n + m + 2);
			t1 = 0; t2 = 0;
			for (int i = 0; i < m; ++i)
			{
				if (place[i][x]>0)
					addedge(0, i + 1, place[i][x], 0);
				t1 += place[i][x];
			}
			for (int i = 0; i < n; ++i)
			{
				if (shop[i][x]>0)
					addedge(m + i + 1, m + n + 1, shop[i][x], 0);
				t2 += shop[i][x];
			}
			if (t1 < t2)
			{
				ans = -1; break;
			}
			for (int i = 0; i < n; ++i)
			{
				for (int j = 0; j < m; ++j)
					addedge(j + 1, m + i + 1, INF, goods[x][i][j]);
			}
			t1 = 0; t2 = 0;
			t2 = minCostMaxflow(0, m + n + 1, t1);
			ans += t1;
		}
		printf("%d\n", ans);
	}
	//while (1);
	return 0;
}

【数据集】中国各类水文专业常用数据集合集 对中国各类水文专业常用数据集进行整理并总结 阅读详情

相关推荐

断点回归(regression discontinuity design)学习笔记

本篇博文主要是对断点回归的一些学习和总结~ 学习材料如下: 1 断点回归设计RDD分类与操作案例 2 RDD断点回归, Stata程序百科全书式的宝典 3 断点回归设计的前沿研究现状, RDD 4 让“跳跃”更有意义:断点回归设计(RDD) 5 Stata: 断点回归 (RDD) 教程 6 怎么用通俗的语言解释断点回归?它与DID的区别是什么 7 Watering Down Environmental Regulation in China,Guojun He, Shaoda Wang, Bing Zhan

Claire_chen_jia的博客 9万+

POJ2516 Minimum Cost 最小费用流

此题一开始想错了算法,直接将k个物品放在一个网络中求了一次最小费用。直接TLE。。。。后来看了DISCUSS发现对于每一种物品分开求最小费用最大流。这样就降低了点的数量。每次费用流最坏的情况就是102个点,而之前一次求的话点最坏可能到5000,边的数量更加恐怖。。。。。。 建图。 对于第k种物品 1:第i个商店和源点连,容量为相应物品的需求,费用为0 2:第i个仓库和汇点连,容量为相应

707

全网最全医学图像数据汇总

本仓库汇总了多个领域的医学图像开源数据集,涵盖CT、MRI、超声、内窥镜、病理、多模态、PET、OCT以及皮肤镜等多种成像技术。每个数据集均详细列出了任务类型、部位、格式、数量及下载链接,旨在为医学图像研究者提供便捷的资源导航。⚠️:这些数据集仅适用于学术研究用途。

2401_83173765的博客 3319

POJ【2516】Minimum Cost(最小费用流)

题目链接:http://poj.org/problem?id=2516 分析 这道题考查最小费用流,首先建立源点和汇点,源点指向所有的供应商,边的流量为供应商的供应量,费用为0,商店指向汇点,边的流量为商店的需求量,费用为0,供应商指向商店,流量为无穷大,代表流量没有限制(前提是供过于或等于求),费用为运送商品的费用。注意这道题需要分k次求最大流,这样每一次建边,边的流量就是每种物品的供应量或需求...

yj8023xx的博客 317

TPRI-DMP平台介绍

TPRI-DMP为华能集团西安热工院自主产权的工业云PaaS平台,已经过13年的发展和迭代,其具备大规模能源电力行业生产应用软件开发和运行能力

ashou706的专栏 2271

对计算机专业来说学历真的重要吗?

我本科学校是渣渣二本,研究生学校是985,现在毕业五年,校招笔试、面试,社招面试参加了两年了,就我个人的经历来说下这个问题。 这篇文章很长,但绝对是精华,相信我,读完以后,你会知道学历不好的解决方案,记得帮我点赞哦。 先说结论,无论赞不赞同,它本质就是这样:对于技术类工作而言,学历五年以内非常重要,但有办法弥补。五年以后,不重要。 目录: 张雪峰讲述的事实 我看到的事实 为什么会这样 ...

启舰 55万+

POJ2516 Minimum Cost (费用流)

题意: 摘自:https://blog.youkuaiyun.com/qq_30974369/article/details/76648579 一行是三个数字:N,M,K 分别表示有N个商店,M个供货商,K中货物 接下来是N行,每行K个整数 对于第i行第j列,表示的是第i个商店对于货物j的需求 再接着,M行,每行K个整数 对于第i行第j列,表示的是第i个供货商对于货物j的存货 接下来有K个N*M的矩形 第X个...

CY05627的博客 342

【基于 CasADi 的欠驱动无人船实时非线性模型预测控制(NMPC)实现与避碰仿真】MATLAB开源复现

本文提出了一种基于CasADi的欠驱动无人船实时非线性模型预测控制(NMPC)方法,实现了轨迹跟踪与避碰功能。研究采用三自由度USV动力学模型,集成静态与动态障碍物避碰约束,并满足国际海上避碰规则(COLREGS)。通过CasADi+IPOPT数值优化求解,实现了毫秒级实时控制。文章详细介绍了USV建模、NMPC控制器设计、避碰约束建模以及CasADi实现流程,包括核心求解流程和轨迹生成方法。实验结果表明,该方法能有效实现复杂环境下的轨迹跟踪与避碰功能。

vor234的博客 1394

POJ - 2516 Minimum Cost 费用流,拆图

题目链接 https://vjudge.net/problem/POJ-2516 题意 n个店铺,从m个市场进货,k种货物。给定市场k种货物存量,店铺k种货物需求,运输花费,问是否能满足要求,最小花费是多少 思路 费用流没得跑,就看如何建图 我一开始是一次性建图,出现以下几个问题 点编号太难了,一一对应很费脑子 边太多了,MCMF超时 看别的博客知道了要拆成k张图,对k种货物一一处理。因为我们需要满足所有需求,也就是必须满流,所以可以独立得拆成k张图,拆了之后发现建图简单了一个量级,按部就班建图就可以了

TheSunspot的博客 287

功能安全实战系列12-英飞凌TC3xx锁步核及其自检开发

本文介绍了英飞凌Tricore系列芯片的锁步核(Lockstep Core)功能及其故障注入自检机制。锁步核通过主核和检查核同步执行指令,并比较输出结果来检测硬件故障。文章详细阐述了锁步核的工作原理、使能配置方法以及故障注入自检的实现过程。故障注入测试通过专用寄存器LCLTEST触发,系统会定期自动测试比较器节点,验证锁步核的故障检测能力。当检测到异常时,会触发SMU模块的警报机制。该技术为汽车电子系统提供了重要的功能安全保障。

initiallizer的博客 917

S速度曲线轨迹规划(普通变频位置闭环控制算法详细介绍+SCL代码)

位置控制用PD控制器,详细内容介绍请查看下面博客文章:PD控制器算法详细解读_RXXW_Dor的博客-优快云博客鉴于积分和微分在工程上的大量应用,这篇博文主要讲解工程上的如何求导f'(x),导数反映的是函数(信号)的变化率,牛顿也是在研究运动的时候提出了微积分的概念,我们知道反映位移变化的快慢程度是速度v(t),反映速度变化快慢程度的物理量是加速度(速度的变化率)。

RXXW_Dor的博客 3885

POJ 2516 Minimum Cost(费用流)

POJ 2516 Minimum Cost 题目链接 题意:转一篇题意吧。。感觉写的很详细了,優YoU http://blog.youkuaiyun.com/lyy289065406/article/details/6742534 思路:一开始是把所有商家的每种物品和所有供应商所有物品连边跑费用流,结果TLE了,因为这样建出来的图,边数会非常的庞大 那么其实转化一下思路,每种物品

Remilia's 918

SST专题(2-2)MMC-SST 输入级的工作原理及数学模型

本文研究了MMC-SST和iMMC-SST的电路结构及工作原理。系统由前级MMC电路和后级DC/DC电路组成,MMC负责电能转换和能量存储,DC/DC电路进行电压电流调节。重点分析了半桥型子模块(SM)的开关组态和工作原理,建立了平均值模型,推导了上下桥臂电压方程和环流特性。研究表明,通过合理控制子模块充放电模态可维持端口电压平衡,上下桥臂电压调控可影响网侧功率吸收,而环流特性对中压直流侧电压具有重要影响。

嵌入式老牛的博客 768

POJ 2516 Minimum Cost(费用流 建图)

POJ 2516题目大意有N个供给商,M个雇主,K种物品。每个供给商对每种物品的的供给量已知,每个雇主对每种物品的需求量的已知,从不同的供给商输送不同的货物到不同的雇主手上需要不同的花费,又已知从供给商Mj送第kind种货物的单位数量到雇主Ni手上所需的单位花费。 问:供给是否满足需求?若是满足,最小运费是多少?分析可以看出k个物品之间是相互独立的,有两种方法:1是把每个点拆成k个点,2是对每个物

AIDreamer 3978

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

【网络流】【费用流】[POJ 2516]Minimum Cost

题目描述 Dearboy, a goods victualer, now comes to a big problem, and he needs your help. In his sale area there are N shopkeepers (marked from 1 to N) which stocks goods from him.Dearboy has M supply p

JeremyGJY的专栏 588

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

POJ 2516 Minimum Cost 费用流

题目源:https://vjudge.net/problem/POJ-2516              http://poj.org/problem?id=2516 模板源:https://blog.youkuaiyun.com/Adolphrocs/article/details/84558274 题解:费用流 求出对于每个k,supply 与 shopkeeper的网络流,然后累加 #incl...

Adolphrocs的博客 354

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

poj 2516 Minimum Cost(费用流)

Minimum Cost Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 17714   Accepted: 6225 Description Dearboy, a goods victualer, now comes to a big problem, and

gyr 232

POJ 2516 Minimum Cost //费用流

<br />Minimum CostTime Limit: 4000MS Memory Limit: 65536KTotal Submissions: 7104 Accepted: 2334<br />DescriptionDearboy, a goods victualer, now comes to a big problem, and he needs your help. In his sale area there are N shopkeepers (marked from 1 to N

hqd_acm的专栏 1345

Poj 2516 Minimum Cost【费用流Min_Cost_Max_flow】

Minimum Cost Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 15826   Accepted: 5531 Description Dearboy, a goods victualer, now comes to a big problem, and

mengxiang000000 981

POJ 2516 Minimum Cost (网络流,最小费用流)

POJ 2516 Minimum Cost (网络流,最小费用流) Description Dearboy, a goods victualer, now comes to a big problem, and he needs your help. In his sale area there are N shopkeepers (marked from 1 to N) which s...

dipinzhu4111的博客 165

poj2516 minimum cost 最小费用流

/*  * 把k种物品分开算  再求和  * 和EK最大流算法差不多,只不过EK算法是BFS搜索深度最小的可行路径作为增广路,而最小费用流是找权值最小的可行路径作为增广  * 路。(这里可行路径指可以使流量增大的路径)  * 这个代码完全是根据POJ1459改的,我把1459的代码贴在最下面了,就不讲了,还是画图,看代码才能理解。  *  *顺便说一下,有人说不知道增广路是什么,其实他

emmmmmm 3189

Minimum Cost POJ - 2516 费用流

传送门:POJ2516 题意:有n个客户,k种商品,m个仓库,每个仓库里都存有不等量的k种商品,现给出i种商品运送到客户j的单位花费,问满足所有客户需求的最小花费是多少,若不能满足需求则输出-1。 思路:典型最小费用流,并且能否满足需求是可以提前算出来的,只要k种物品中的每一种都总需求小于总供应(即供大于求)就能满足。然后是建图,我们无法一下求出k种物品的最小花费,但由于k种物品是互不相干的,

WA是一笔财富 338

【POJ】 2516 Minimum Cost 费用流

Minimum Cost Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 13052   Accepted: 4442 Description Dearboy, a goods victualer, now comes to a big problem, and he

poursoul 809

POJ 2516 — Minimum Cost 费用流

原题:http://poj.org/problem?id=2516 题意: 有n家商店,m个供应商,k个商品; n*k的矩阵,第i行表示第i家商店对这k个商品的需求量; m*k的矩阵,第i行表示第i家供应商的存货; 接下来有k个n*m的矩阵, 第i个矩阵表示第i个商品在运输过程中的花费; 问最小花费,若不能满足各商店的需求则输出-1; 思路: 计算k个费用流,累加;

吧唧吧唧 486

poj 2516 Minimum Cost (最小费用流)

这题不错,分开最小费用流,每种物品来一次。 /* * this code is made by LinMeiChen * Problem: * Type of Problem: * Thinking: * Feeling: */ #include #include #include #include #include #include #include #include #include #

ACM之梦 674

POJ 2516 Minimum Cost(网络流之费用流)

题目地址:POJ 2516 我晕啊。。。这题一上来就想到了对每种货物分开求。。但是马上就放弃了。。感觉这样求50次费用流太耗时。。后来就果断拆点,拆了好长时间,一直TLE。。即使降到了2600个点也TLE。。然后又想起了这个分开求的方法,又突然觉得100个点的费用流几乎不费什么时间。。最多也只是求50次而已,还是可以试试的。。于是一试居然还真过了。。。 说到这里,思路应该已经知道了吧。就是对每

scf0920 1081
上一篇: POJ 1201 Intervals 差分约束
下一篇: POJ 2195 Going Home 费用流
sky-edge
博客等级 码龄12年 20粉丝 191原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值