度度熊参与了喵哈哈村的商业大会,但是这次商业大会遇到了一个难题:

喵哈哈村以及周围的村庄可以看做是一共由n个片区,m条公路组成的地区。

由于生产能力的区别,第i个片区能够花费a[i]元生产1个商品,但是最多生产b[i]个。

同样的,由于每个片区的购买能力的区别,第i个片区也能够以c[i]的价格出售最多d[i]个物品。

由于这些因素,度度熊觉得只有合理的调动物品,才能获得最大的利益。

据测算,每一个商品运输1公里,将会花费1元。

那么喵哈哈村最多能够实现多少盈利呢?

Input本题包含若干组测试数据。 
每组测试数据包含: 
第一行两个整数n,m表示喵哈哈村由n个片区、m条街道。 
接下来n行,每行四个整数a[i],b[i],c[i],d[i]表示的第i个地区,能够以a[i]的价格生产,最多生产b[i]个,以c[i]的价格出售,最多出售d[i]个。 
接下来m行,每行三个整数,u[i],v[i],k[i],表示该条公路连接u[i],v[i]两个片区,距离为k[i]

可能存在重边,也可能存在自环。

满足: 
1<=n<=500, 
1<=m<=1000, 
1<=a[i],b[i],c[i],d[i],k[i]<=1000, 
1<=u[i],v[i]<=n 
Output输出最多能赚多少钱。 
Sample Input

  1. 2 1
  2. 5 5 6 1
  3. 3 5 7 7
  4. 1 2 1

Sample Output

  1. 23
    题解:

最小费用最大流,首先建立超级源点 s ,与超级汇点 t 。

因为生产一个商品需要花费 a[i] 元,且上限为 b[i] ,所以我们从 s 向这些点之间连一条容量为 b[i] ,费用为 -a[i] 的边。

同样的道理,出售一个商品可以赚到 c[i] 元,最多出售 d[i] 个,于是我们从这些点向 t 连一条容量为 d[i] ,费用为 c[i] 的边。

最后所有的公路也是花费,从 u 到 v 连接一条双向边,容量为 INF ,费用为 -k ,然后跑一边模板即可。

注意:图中存在自环,当我们得到两点路径长度小于 0 时应终止计算。

参考代码为

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define INF 0x3f3f3f3f
  4. typedef long long LL;
  5. const int M=;
  6. const int N=;
  7. struct edge
  8. {
  9. int to,cap,cost,nxt;
  10. } e[];
  11.  
  12. int head[N],tot;
  13. int d[N], pre[N], path[N];
  14. bool vis[N];
  15.  
  16. void init()
  17. {
  18. memset(head,-,sizeof(head));
  19. tot = ;
  20. }
  21.  
  22. void addedge(int s, int t, int cap, int cost)
  23. {
  24. e[tot].to=t;
  25. e[tot].cap=cap;
  26. e[tot].cost=cost;
  27. e[tot].nxt=head[s];
  28. head[s] = tot++;
  29. e[tot].to=s;
  30. e[tot].cap=;
  31. e[tot].cost=-cost;
  32. e[tot].nxt=head[t];
  33. head[t] = tot++;
  34. }
  35.  
  36. int spfa(int s, int t)
  37. {
  38. memset(d,-INF,sizeof(d));
  39. memset(pre,-,sizeof(pre));
  40. memset(path,-,sizeof(path));
  41. memset(vis,false,sizeof(vis));
  42. int res = d[];
  43. d[s] = ;
  44. vis[s] = true;
  45. queue<int>q;
  46. q.push(s);
  47. while (!q.empty())
  48. {
  49. int u = q.front();
  50. q.pop();
  51. vis[u] = false;
  52. for (int i = head[u]; ~i; i = e[i].nxt)
  53. {
  54. int v = e[i].to;
  55. if (d[v] < d[u] + e[i].cost && e[i].cap > )
  56. {
  57. d[v] = d[u] + e[i].cost;
  58. pre[v] = u;
  59. path[v] = i;
  60. if (!vis[v])
  61. {
  62. vis[v] = true;
  63. q.push(v);
  64. }
  65. }
  66. }
  67. }
  68. return d[t] != res;
  69. }
  70.  
  71. int MinCostMaxFlow(int s, int t,int &cost)//返回最大流,cost为最小费用
  72. {
  73. int flow;
  74. flow=cost=;
  75. while (spfa(s, t))
  76. {
  77. int minn = INF;
  78. for(int i = t; i != s && ~i; i = pre[i]) minn = min(minn, e[path[i]].cap);
  79. for(int i = t; i != s && ~i; i = pre[i])
  80. {
  81. e[path[i]].cap -= minn;
  82. e[path[i] ^ ].cap += minn;
  83. }
  84. if(d[t]<) break; //由于可能会有自环
  85. flow += minn;
  86. cost += minn * d[t];
  87. }
  88. return flow;
  89. }
  90. int n,m;
  91. int main()
  92. {
  93. while(scanf("%d%d",&n,&m)!=EOF)
  94. {
  95. init();
  96. int a,b,c,d;
  97. int st=,end=n+,cost;
  98. for(int i=;i<=n;i++)
  99. {
  100. scanf("%d%d%d%d",&a,&b,&c,&d);
  101. addedge(st,i,b,-a);
  102. addedge(i,end,d,c);
  103. }
  104. int u,v,k;
  105. while(m--)
  106. {
  107. scanf("%d%d%d",&u,&v,&k);
  108. addedge(u,v,INF,-k);
  109. addedge(v,u,INF,-k);
  110. }
  111. MinCostMaxFlow(st,end,cost);
  112. cout<<cost<<endl;
  113. }
  114. }

  

HDU 6118 度度熊的交易计划(网络流-最小费用最大流)的更多相关文章

  1. HDU 6118 度度熊的交易计划 【最小费用最大流】 (2017"百度之星"程序设计大赛 - 初赛(B))

    度度熊的交易计划 Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  2. hdu 6118度度熊的交易计划(费用流)

    度度熊的交易计划 Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  3. HDU 6118 度度熊的交易计划 (最小费用流)

    度度熊的交易计划 Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  4. hdu 6118 度度熊的交易计划

    度度熊的交易计划 Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  5. HDU 6118 度度熊的交易计划 最大费用可行流

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6118 题意:中文题 分析: 最小费用最大流,首先建立源点 s ,与超级汇点 t .因为生产一个商品需要 ...

  6. HDU 6118 度度熊的交易计划(最小费用最大流)

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

  7. HDU 6118 度度熊的交易计划(费用流)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=6118 [题目大意] 给出一张无向边权图,每个点最多可以生产b[i]商品,每件代价为a[i], 每个 ...

  8. HDU 6118 2017百度之星初赛B 度度熊的交易计划(费用流)

    度度熊的交易计划 Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  9. 2017"百度之星"程序设计大赛 - 初赛(B) 度度熊的交易计划 最小费用最大流求最大费用

    /** 题目:度度熊的交易计划 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6118 题意:度度熊参与了喵哈哈村的商业大会,但是这次商业大会遇到了一个难题 ...

随机推荐

  1. Python 基础之socket编程(三)

    python 基础之socket编程(三) 前面实现的基于socket通信只能实现什么呢?在tcp协议的通信中就是一个用户说一句,服务端给你回一句,你再给服务端说一句,服务端再给你回一句,就这样一直友 ...

  2. 三张关联表,大表;单次查询耗时400s,有group by order by 如何优化

    问题SQL: select p.person_id as personId, p.person_name as personName, p.native_place as nativePlace, c ...

  3. PHP Laravel5实现的RBAC权限管理操作示例

    根据不同的权限,在菜单栏显示不同的功能,只对菜单进行了限制,若对路由也进行限制,可以根据菜单的例子,请自行完善,开发.下面请认真学习一下laravel的RBAC设计 1.建表(用户表.角色表.权限表. ...

  4. 如何基于k8s快速搭建TeamCity(YAML分享)

    前言 最近有朋友基于之前的博客<Docker最全教程之使用TeamCity来完成内部CI.CD流程(十七)>搭建TeamCity时出现了一些问题,由于平常比较忙,没有及时答复,非常抱歉. ...

  5. Verilog模块概念和实例化#转载自Jason from Lofter

    Verilog模块概念和实例化 模块的概念 模块(module)是verilog最基本的概念,是v设计中的基本单元,每个v设计的系统中都由若干module组成. 1.模块在语言形式上是以关键词modu ...

  6. fastjason常用方法

    背景 fastjson爆出重大漏洞,攻击者可使整个业务瘫痪 漏洞描述 常用JSON组件FastJson存在远程代码执行漏洞,攻击者可通过精心构建的json报文对目标服务器执行任意命令,从而获得服务器权 ...

  7. 使用ASP.NET Core 3.x 构建 RESTful API - 3.2 路由和HTTP方法

    ASP.NET Core 3.x 的路由 路由机制会把一个请求的URI映射到一个Controller上面的Action,所以当你发送一个HTTP请求的时候,MVC框架会解析这个请求的URI,并尝试着把 ...

  8. android 网络异步加载数据进度条

    ProgressDialog progressDialog = null; public static final int MESSAGETYPE = 0; private void execute( ...

  9. websrom编译器

    webstorm less环境配置 备注: 安装node后,在命令行输入npm install -g less 即可安装less,打开webstorm setting-Tools-FileWatche ...

  10. socket解决编码解码问题

    MySocket类: import socket class MySocket(socket.socket): # 继承自socket文件中的socket类,此时socket就是父类 def __in ...