添加超级源点(与点1之间的边容量为2,权值为0)和超级汇点(与点N之间的边容量为2,权值为0),求流量为2的最小费用流。注意是双向边。

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <vector>
  4. #include <queue>
  5. using namespace std;
  6. const long long INF = 0x3f3f3f3f3f3f3f3f;
  7. typedef long long ll;
  8. typedef pair<ll,int> P;
  9. struct edge
  10. {
  11. int to,cap;
  12. ll cost;
  13. int rev;
  14. };
  15. int V,E;
  16. vector<edge> G[1005];
  17. ll h[1005];
  18. ll dist[1005];
  19. int prevv[1005];
  20. int preve[1005];
  21. void add_edge(int from,int to,int cap,ll cost)
  22. {
  23. edge e;
  24. e.to = to;
  25. e.cap = cap;
  26. e.cost = cost;
  27. e.rev = G[to].size();
  28. G[from].push_back(e);
  29. e.to = from;
  30. e.cap = 0;
  31. e.cost = -cost;
  32. e.rev = G[from].size() - 1;
  33. G[to].push_back(e);
  34. }
  35.  
  36. ll min_cost_flow(int s,int t,int f)
  37. {
  38. ll res = 0;
  39. fill(h,h + V,0);
  40. while(f > 0)
  41. {
  42. priority_queue <P,vector <P>,greater<P> >que;
  43. fill(dist,dist + V,INF);
  44. dist[s] = 0;
  45. que.push(P(0,s));
  46. while(!que.empty())
  47. {
  48. P p = que.top();
  49. que.pop();
  50. int v = p.second;
  51. if(dist[v] < p.first)
  52. {
  53. continue;
  54. }
  55. for(int i = 0;i < G[v].size();i ++)
  56. {
  57. edge & e = G[v][i];
  58. if(e.cap > 0 && dist[e.to] > dist[v] + e.cost + h[v] - h[e.to])
  59. {
  60. dist[e.to] = dist[v] + e.cost + h[v] - h[e.to];
  61. prevv[e.to] = v;
  62. preve[e.to] = i;
  63. que.push(P(dist[e.to],e.to));
  64. }
  65. }
  66. }
  67. if(dist[t] == INF)
  68. {
  69. return -1;
  70. }
  71. for(int v = 0;v < V;v ++)
  72. {
  73. h[v] += dist[v];
  74. }
  75. int d = f;
  76. for(int v = t;v != s;v = prevv[v])
  77. {
  78. d = min(d,G[prevv[v]][preve[v]].cap);
  79. }
  80. f -= d;
  81. res += d * h[t];
  82. for(int v = t; v != s; v = prevv[v])
  83. {
  84. edge & e = G[prevv[v]][preve[v]];
  85. e.cap -= d;
  86. G[v][e.rev].cap += d;
  87. }
  88. }
  89. return res;
  90. }
  91. int main()
  92. {
  93. int a,b;
  94. ll c;
  95. cin >> V >> E;
  96.  
  97. for(int i = 0;i < E;i ++)
  98. {
  99. scanf("%d%d%lld",&a,&b,&c);
  100. add_edge(a,b,1,c);
  101. add_edge(b,a,1,c);
  102. }
  103. add_edge(0,1,2,0);
  104. add_edge(V,V + 1,2,0);
  105. V += 2;
  106. cout << min_cost_flow(0,V - 1,2) << endl;
  107. return 0;
  108. }

  

poj2135 最小费用流的更多相关文章

  1. poj2135最小费用流

    裸题,就是存个模板 最小费用流是用spfa求解的,目的是方便求解负环,spfa类似于最大流中的bfs过程 #include<map> #include<set> #includ ...

  2. [poj2135]Farm Tour(最小费用流)

    解题关键:最小费用流 代码一:bellma-ford $O(FVE)$  bellman-ford求最短路,并在最短路上增广,速度较慢 #include<cstdio> #include& ...

  3. poj2135(简单的最小费用流问题)

    题目链接:http://poj.org/problem?id=2135 Farm Tour Time Limit: 1000MS   Memory Limit: 65536K Total Submis ...

  4. POJ2195 最小费用流

    题目:http://poj.org/problem?id=2195 处理出每个人到每个门的曼哈顿距离,分别建立容量为1费用为曼哈顿距离的边,在源点和每个人人之间建立容量为1费用为0的边,在门和汇点之间 ...

  5. HDU 4067 hdoj 4067 Random Maze 最小费用流

    给出n个点,m条边,入口s和出口t,对于每条边有两个值a,b,如果保留这条边需要花费:否则,移除这条边需要花费b. 题目要求用最小费用构造一个有向图满足以下条件: 1.只有一个入口和出口 2.所有路都 ...

  6. POJ 2516:Minimum Cost(最小费用流)

    https://vjudge.net/problem/11079/origin 题意:有N个商店和M个供应商和K种物品,每个商店每种物品有一个需求数,每个供应商每种物品有一个供应量,供应商到商店之间的 ...

  7. POJ-2175 Evacuation Plan 最小费用流、负环判定

    题意:给定一个最小费用流的模型,根据给定的数据判定是否为最优解,如果不为最优解则给出一个比给定更优的解即可.不需要得出最优解. 解法:由给定的数据能够得出一个残图,且这个图满足了最大流的性质,判定一个 ...

  8. Going Home (hdu 1533 最小费用流)

    集训的图论都快结束了,我才看懂了最小费用流,惭愧啊. = = 但是今天机械键盘到了,有弄好了自行车,好高兴\(^o^)/~ 其实也不是看懂,就会套个模板而已.... 这题最重要的就是一个: 多组输入一 ...

  9. POJ 2195 Going Home 最小费用流 裸题

    给出一个n*m的图,其中m是人,H是房子,.是空地,满足人的个数等于房子数. 现在让每个人都选择一个房子住,每个人只能住一间,每一间只能住一个人. 每个人可以向4个方向移动,每移动一步需要1$,问所有 ...

随机推荐

  1. VS2008中使用JSONCPP方法小结

    Introduction JSON (JavaScript Object Notation) is a lightweight data-interchange format. It can repr ...

  2. 22.java方法的定义

    java中的方法:就相当于c语言中的函数:sun在开发java的时候,为提高其代码的重复利用率,引入了方法. 什么是方法? 方法就是一段代码片段,这个片段可以完成特定的功能,并且可以重复利用. 从入口 ...

  3. shell脚本自动部署nignx反向代理及web服务器,共享存储

    #!/bin/bash systemctl status nginx var=$? ] then yum install epel-release -y ] then echo "epel库 ...

  4. STL中的vector实现邻接表

    /* STL中的vector实现邻接表 2014-4-2 08:28:45 */ #include <iostream> #include <vector> #include  ...

  5. 2 手写Java LinkedList核心源码

    上一章我们手写了ArrayList的核心源码,ArrayList底层是用了一个数组来保存数据,数组保存数据的优点就是查找效率高,但是删除效率特别低,最坏的情况下需要移动所有的元素.在查找需求比较重要的 ...

  6. 小程序接收from表单数据(实例)

    html部分 <form bindsubmit='sub'> <view class="con"> <view class="con-nr& ...

  7. C#基础知识回顾

    值类型和引用类型 值类型存在栈上,结构,枚举,数值类型 引用类型存在堆上,数组,类,接口,委托 把值类型存到引用类型中就是封箱,耗时 引用类型中的值类型是存在堆上,不是栈上,但是作为参数传递时,还是会 ...

  8. MarketServer 日志

    2014.04.29 1. 发现有时候会跳出 Exception Infomations:   用户异常信息:Socket未连接 跟踪后发现的一次情况是: 服务器根据客户端请求从后台读取数据后,写数据 ...

  9. [Xcode 实际操作]九、实用进阶-(31)为IAP(支付方式)内购功能的具体实现和测试

    目录:[Swift]Xcode实际操作 本文将演示如何为IAP(支付方式)内购功能的具体实现和测试. 内购是苹果市场上的一种常见的盈利方式. 在项目中确保已经安装了第三方库[Pod],双击[Podfi ...

  10. Java常见设计模式学习(非原创)

    文章大纲 一.策略模式二.观察者模式三.工厂模式四.单例模式五.其他模式六.设计模式总结七.参考文章   一.策略模式 现在假设我们有个"鸭子项目",首先我们用OOP(面向对象)的 ...