题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3904

思路:费用流的题,增加一个超级源点和一个超级汇点,然后就是连边了,对于每个城市,与汇点连边,容量为inf,花费(这里指收益)为商品在该城市的价值,然后对于图中给定的边,容量为cap,花费为-cost(负数代表花费),最后就是源点与城市1连边了,然后就是跑费用流了,求最大收益(当dist[vt]<0时直接退出)。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<queue>
  6. using namespace std;
  7. #define MAXN 222
  8. #define inf 1<<30
  9.  
  10. struct Edge{
  11. int v,cap,cost,next;
  12. }edge[MAXN*MAXN];
  13.  
  14. int n,m,vs,vt,NE;
  15. int head[MAXN];
  16.  
  17. void Insert(int u,int v,int cap,int cost)
  18. {
  19. edge[NE].v=v;
  20. edge[NE].cap=cap;
  21. edge[NE].cost=cost;
  22. edge[NE].next=head[u];
  23. head[u]=NE++;
  24.  
  25. edge[NE].v=u;
  26. edge[NE].cap=;
  27. edge[NE].cost=-cost;
  28. edge[NE].next=head[v];
  29. head[v]=NE++;
  30. }
  31.  
  32. bool mark[MAXN];
  33. int dist[MAXN],pre[MAXN],cur[MAXN];
  34. bool spfa(int vs,int vt)
  35. {
  36. memset(mark,false,sizeof(mark));
  37. fill(dist,dist+MAXN,-inf);
  38. dist[vs]=;
  39. queue<int>que;
  40. que.push(vs);
  41. while(!que.empty()){
  42. int u=que.front();
  43. que.pop();
  44. mark[u]=false;
  45. for(int i=head[u];i!=-;i=edge[i].next){
  46. int v=edge[i].v,cost=edge[i].cost;
  47. if(edge[i].cap>&&dist[u]+cost>dist[v]){
  48. dist[v]=dist[u]+cost;
  49. pre[v]=u;
  50. cur[v]=i;
  51. if(!mark[v]){
  52. mark[v]=true;
  53. que.push(v);
  54. }
  55. }
  56. }
  57. }
  58. return dist[vt]>;
  59. }
  60.  
  61. int MinCostFlow(int vs,int vt)
  62. {
  63. int flow=,cost=;
  64. while(spfa(vs,vt)){
  65. int aug=inf;
  66. for(int u=vt;u!=vs;u=pre[u]){
  67. aug=min(aug,edge[cur[u]].cap);
  68. }
  69. flow+=aug,cost+=aug*dist[vt];
  70. for(int u=vt;u!=vs;u=pre[u]){
  71. edge[cur[u]].cap-=aug;
  72. edge[cur[u]^].cap+=aug;
  73. }
  74. }
  75. return cost;
  76. }
  77.  
  78. int main()
  79. {
  80. int x,u,v,cap,cost;
  81. while(~scanf("%d%d",&n,&m)){
  82. vs=,vt=n+;
  83. NE=;
  84. memset(head,-,sizeof(head));
  85. for(int i=;i<=n;i++){
  86. scanf("%d",&x);
  87. Insert(i,vt,inf,x);
  88. }
  89. while(m--){
  90. scanf("%d%d%d%d",&u,&v,&cap,&cost);
  91. Insert(u,v,cap,-cost);
  92. Insert(v,u,cap,-cost);
  93. }
  94. Insert(vs,,inf,);
  95. printf("%d\n",MinCostFlow(vs,vt));
  96. }
  97. return ;
  98. }

zoj 3362(最大费用)的更多相关文章

  1. ZOJ 3362 Beer Problem(SPFA费用流应用)

    Beer Problem Time Limit: 2 Seconds      Memory Limit: 32768 KB Everyone knows that World Finals of A ...

  2. ZOJ 3362 Beer Problem

    Beer Problem Time Limit: 2000ms Memory Limit: 32768KB This problem will be judged on ZJU. Original I ...

  3. zoj 3469 Food Delivery 区间dp + 提前计算费用

    Time Limit: 2 Seconds      Memory Limit: 65536 KB When we are focusing on solving problems, we usual ...

  4. 费用流 ZOJ 3933 Team Formation

    题目链接 题意:两个队伍,有一些边相连,问最大组对数以及最多女生数量 分析:费用流模板题,设置两个超级源点和汇点,边的容量为1,费用为男生数量.建边不能重复建边否则会T.zkw费用流在稠密图跑得快,普 ...

  5. ZOJ 3792 Romantic Value 最小割(最小费用下最小边数)

    求最小割及最小花费 把边权c = c*10000+1 然后跑一个最小割,则flow / 10000就是费用 flow%10000就是边数. 且是边数最少的情况.. #include<stdio. ...

  6. ZOJ 2404 Going Home 【最小费用最大流】

    思路: 把房子和人看成点,加上源点和汇点. 源点和每个人连容量为1,权值为0的边. 每个人和每个房子连容量为1,权值为距离的边. 每个房子和汇点连容量为1,权值为0的边. #include<st ...

  7. 【转载】图论 500题——主要为hdu/poj/zoj

    转自——http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...

  8. zoj 3537 Cake 区间DP (好题)

    题意:切一个凸边行,如果不是凸包直接输出.然后输出最小代价的切割费用,把凸包都切割成三角形. 先判断是否是凸包,然后用三角形优化. dp[i][j]=min(dp[i][j],dp[i][k]+dp[ ...

  9. ZOJ 刷题记录 (。・ω・)ノ゙(Progress:31/50)

    [热烈庆祝ZOJ回归] P1002:简单的DFS #include <cstdio> #include <cstring> #include <algorithm> ...

随机推荐

  1. ORACLE expdp/impdp详解(转)

    ORCALE10G提供了新的导入导出工具,数据泵.Oracle官方对此的形容是:Oracle DataPump technology enables Very High-Speed movement ...

  2. MongoDB 日志太大怎么办?

    MongoDB的日志增长的非常快,/var所在的空间立即就占满了,即便换到还有一个磁盘分区保存日志.日志还是增长的非常快.磁盘眼看要告磬. 有一个好办法,就是使用旋转日志. MongoDB的旋转日志有 ...

  3. BEGINNING SHAREPOINT&#174; 2013 DEVELOPMENT 第2章节--SharePoint 2013 App 模型概览 理解三个SharePoint 部署模型 Apps

    BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第2章节--SharePoint 2013 App 模型概览 理解三个SharePoint 部署模型 Apps       ...

  4. ArcGIS 10 安装程序及破解文件

    1.下载 ArcGIS 10 安装程序及破解文件 后面提供电驴的下载地址(可以使用迅雷.QQ旋风等下载工具下载),下载文件是一个光盘镜像文件:‍ArcGIS_Desktop10_122519.iso. ...

  5. SQL Prompt几个快捷键

    推荐一个小插件,SQL Prompt,配合Microsoft SQL Server Management Studio,使用起来非常方便,同时再加上以下几个快捷键: (1)ctrl+5或F5,运行代码 ...

  6. js身份证验证算法

    var validateIdCard=function (id, backInfo) { var info={ y: "1900", m: "01", d: & ...

  7. AutoFac文档8(转载)

    目录 开始 Registering components 控制范围和生命周期 用模块结构化Autofac xml配置 与.net集成 深入理解Autofac 指导 关于 词汇表 泛型 给定一个开放的泛 ...

  8. C++知识点 笔试常见

    C++知识点   一.#include “filename.h”和#include <filename.h>的区别 #include “filename.h”是指编译器将从当前工作目录上开 ...

  9. python实现dict版图遍历

    python实现dict版图遍历的示例. 代码: #_*_coding:utf_8_import sysimport osclass Graph(): def __init__(self, V, E) ...

  10. c#取得post和get的数据和模拟发送

    可以放在控制器的入口函数中,这样载入就会被调用 asp.net mvc,get+post: public ActionResult Index() { ) { foreach (var item in ...