题目链接:点击查看

题目大意:给出一张 n 个点 m 条边的有向图,每个点可以生产至多 b[ i ] 个物品,每个物品花费为 a[ i ] ,可以出售至多 d[ i ] 个物品,每个物品售价为 c[ i ],所有的物品都是一样的,而运输一个物品一公里需要花费一个单位的金钱,现在问如何调配,才能使得收益最大

题目分析:最大费用可行流,注意这里是可行流而不是最大流,如果是最大流的话下面这一组样例跑不过去:

5 4
1 2 1 2
2 1 2 1
2 3 4 5
5 4 3 2
100 1 1 1
1 2 1
2 3 1
3 4 1
1 5 1
ans = 8

所以在这个题目中,最大费用的优先级要高于最大流,所以spfa中的判断条件是必须要有正贡献的增广路才可以增大流量,如果出现负贡献的增广路直接退出即可

建图也非常简单:

  1. 源点 -> 每个点,流量为 b[ i ] ,花费为 -a[ i ]
  2. 原图中的 u 和 v ,u -> v ,流量为 inf ,花费为 -w
  3. 每个点 -> 汇点,流量为 d[ i ] ,花费为 c[ i ]

然后跑模板就好了

最后说点题外话,因为最小费用可行流是一个单独的算法,一直在想为什么这个题不能用最小费用可行流的算法去解决,与前一个题目稍微比较了一下 洛谷 - P4043 ,得出的结论是,最小费用可行流,实际上是用无源汇的可行流将其赋值上费用了而已,转换后的图还是以最大流为优先级,而当所有的边流量都达到下限后,因为所有的边费用都是正的,所以选择的边肯定越少费用越小,所以在之前的那个题目用最小费用可行流是可行的,而在这个题目中,因为边权有负边,所以不能用最大流来限制流量和费用,所以只能修改spfa达到以最大费用为优先级的目的

代码:

//#pragma GCC optimize(2)
//#pragma GCC optimize("Ofast","inline","-ffast-math")
//#pragma GCC target("avx,sse2,sse3,sse4,mmx")
#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#include<bitset>
#include<unordered_map>
using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=510;//点const int M=1e4+100;//边struct Edge
{int to,w,cost,next;
}edge[M];int head[N],cnt;void addedge(int u,int v,int w,int cost)
{edge[cnt].to=v;edge[cnt].w=w;edge[cnt].cost=cost;edge[cnt].next=head[u];head[u]=cnt++;edge[cnt].to=u;edge[cnt].w=0;edge[cnt].cost=-cost;edge[cnt].next=head[v];head[v]=cnt++;
}int d[N],incf[N],pre[N];bool vis[N];bool spfa(int s,int t)
{memset(d,0xcf,sizeof(d));memset(vis,false,sizeof(vis));memset(pre,-1,sizeof(pre));queue<int>q;q.push(s);vis[s]=true;incf[s]=inf;d[s]=0;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;int w=edge[i].w;int cost=edge[i].cost;if(!w)continue;if(d[v]<d[u]+cost){d[v]=d[u]+cost;pre[v]=i;incf[v]=min(incf[u],w);if(!vis[v]){vis[v]=true;q.push(v);}}}}
//    return pre[t]!=-1;return d[t]>0;
}int update(int s,int t)
{int x=t;while(x!=s){int i=pre[x];edge[i].w-=incf[t];edge[i^1].w+=incf[t];x=edge[i^1].to;}return d[t]*incf[t];
}void init()
{memset(head,-1,sizeof(head));cnt=0;
}int solve(int st,int ed)
{int ans=0;while(spfa(st,ed))ans+=update(st,ed);return ans;
}int main()
{
#ifndef ONLINE_JUDGE
//  freopen("data.in.txt","r",stdin);
//  freopen("data.out.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);int n,m,st=N-1,ed=st-1;while(scanf("%d%d",&n,&m)!=EOF){init();for(int i=1;i<=n;i++){int a,b,c,d;scanf("%d%d%d%d",&a,&b,&c,&d);addedge(st,i,b,-a);addedge(i,ed,d,c);}while(m--){int u,v,w;scanf("%d%d%d",&u,&v,&w);if(u!=v){addedge(u,v,inf,-w);addedge(v,u,inf,-w);}}printf("%d\n",solve(st,ed));}return 0;
}

HDU - 6118 度度熊的交易计划(最大费用可行流)相关推荐

  1. 2017百度之星初赛:B-1005. 度度熊的交易计划(最小费用流)

    度度熊的交易计划  Accepts: 460  Submissions: 2329  Time Limit: 12000/6000 MS (Java/Others)  Memory Limit: 32 ...

  2. 【HDU - 6118】度度熊的交易计划(最小费用可行流,网络流费用流变形 )

    题干: 度度熊参与了喵哈哈村的商业大会,但是这次商业大会遇到了一个难题: 喵哈哈村以及周围的村庄可以看做是一共由n个片区,m条公路组成的地区. 由于生产能力的区别,第i个片区能够花费a[i]元生产1个 ...

  3. 【2017百度之星程序设计大赛 - 初赛(B)】度度熊的交易计划

    [链接]点击打开链接 [题意] 在这里写题意 [题解] 先设一个超级源点,向每个片区都建一条边,容量为b,费用为-a; 然后从每个片区再连一条边,指向一个超级汇点. 容量为d,费用为c; 然后从起点到 ...

  4. HDU 6082 度度熊与邪恶大魔王 (完全背包)

    度度熊与邪恶大魔王                                                                 Time Limit: 2000/1000 MS ( ...

  5. HDU - 6082 度度熊与邪恶大魔王(背包变式)

    度度熊与邪恶大魔王 度度熊为了拯救可爱的公主,于是与邪恶大魔王战斗起来. 邪恶大魔王的麾下有n个怪兽,每个怪兽有a[i]的生命值,以及b[i]的防御力. 度度熊一共拥有m种攻击方式,第i种攻击方式,需 ...

  6. HDU 6113 度度熊的01世界【DFS/Flood Fill】

    度度熊的01世界 Accepts: 967 Submissions: 3064  Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/ ...

  7. HDU 6082 度度熊与邪恶大魔王(01背包)

    Description 度度熊为了拯救可爱的公主,于是与邪恶大魔王战斗起来. 邪恶大魔王的麾下有n个怪兽,每个怪兽有a[i]的生命值,以及b[i]的防御力. 度度熊一共拥有m种攻击方式,第i种攻击方式 ...

  8. hdu 6080 度度熊保护村庄

    题意 哗啦啦村袭击了喵哈哈村! 度度熊为了拯救喵哈哈村,带着自己的伙伴去救援喵哈哈村去了!度度熊与伙伴们很快的就过来占据了喵哈哈村的各个军事要地,牢牢的守住了喵哈哈村. 但是度度熊发现,这是一场旷日持 ...

  9. 【hdu 6082 度度熊与邪恶大魔王 】 完全背包

    hdu 6082 这道题一拿过来 对一个熊直接跑完全背包 然后跑 100000 次 完美TLE 其实因为对一个熊跑的时候 下次熊还是会跑的 于是需要对所有的熊直接完全背包预处理 设 dp[i][j] ...

最新文章

  1. databinding学习(1)
  2. POJ1042 贪心钓鱼
  3. 梯度下降法原理及实现
  4. 在tomcat中部署mule项目
  5. 三星gtn8010安卓7_三星Galaxy Note 10.1 N8010 最后的救赎 Andorid 5.0.2 ROM
  6. chrome解决跨域(CORS)问题---chrome插件
  7. 修改 Docker 的镜像存储位置
  8. Java学习系列(十五)Java面向对象之细谈线程、线程通信(下)
  9. 一个批量转换文件编码的python脚本
  10. 《剑指offer》第五十二题(两个链表的第一个公共结点)
  11. 数据中心运维管理经验39条
  12. 用最简单的方法生成代码雨,效果相当的哇塞。
  13. ios越狱开发_隐藏Root(Cydia)图标
  14. 手把手教你搭建属于自己的服务器
  15. 数据结构中的校园导航系统---c语言
  16. H5 简单实现微信公众号摇一摇功能
  17. dns配置异常怎么修复_电脑出现dns错误不能上网怎么办?dns错误修复方法
  18. 图的表示(无权图和有权图)
  19. uiautomation 模块
  20. zoho在线文档使用小技巧

热门文章

  1. 典型环节的matlab仿真分析,典型环节的MATLAB仿真.doc
  2. K8s-V1.17.6支持GPU
  3. android百度地图sdk定位权限,Android:使用百度地图SDK实现定位:下载SDK、申请密钥、动态获得Android权限...
  4. SpringSecurity使用自定义认证页面
  5. Nginx的rewrite之if指令(一)
  6. 为什么使用mq?具体的使用场景是什么?
  7. 什么是Starter
  8. 收货地址 - 需求分析与表设计
  9. Hive和Hadoop及RDBMS关系
  10. BouncyCastle - Java加密与安全