最短路对应费用,路径数量对应流量。为限制点经过次数,拆点为边。跑一次流量为2的最小费用最大流。

最小费用最大流和最大流EK算法是十分相似的,只是把找增广路的部分换成了求费用的最短路。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4.  
  5. const int maxv = +;
  6. const int maxe = +;
  7.  
  8. struct Edge
  9. {
  10. int v,cap,cost,nxt;
  11. void IN(int V,int C,int c,int N)
  12. {
  13. v = V; cap = C; cost = c; nxt = N;
  14. }
  15. }edges[maxe];
  16.  
  17. int head[maxv],ecnt,vcnt;
  18.  
  19. void AddEdge(int u,int v,int C,int c)
  20. {
  21. edges[ecnt].IN(v,C,c,head[u]);
  22. head[u] = ecnt++;
  23. edges[ecnt].IN(u,,-c,head[v]);
  24. head[v] = ecnt++;
  25. }
  26. const int INF = 0x3f3f3f3f;
  27. int S,T;
  28. bool vis[maxv];
  29. int d[maxv],p[maxv],a[maxv];
  30. bool spfa()
  31. {
  32. memset(d,0x3f,sizeof(int)*vcnt);
  33. memset(vis,,sizeof(bool)*vcnt);
  34.  
  35. queue<int> q; q.push(S); d[S] = ;
  36. a[S] = INF;
  37. while(q.size()){
  38. int u = q.front(); q.pop();
  39. vis[u] = false;
  40. for(int i = head[u]; ~i; i = edges[i].nxt){
  41. Edge &e = edges[i];
  42. if(e.cap&& d[e.v] > d[u]+e.cost){
  43. d[e.v] = d[u] + e.cost;
  44. p[e.v] = i;
  45. a[e.v] = min(a[u],e.cap);
  46. if(!vis[e.v]) { q.push(e.v); vis[e.v] = true; }
  47. }
  48. }
  49. }
  50. return d[T] != INF;
  51. }
  52.  
  53. ll MinCostMaxFlow()
  54. {
  55. ll cost = ;
  56. while(spfa()){
  57. cost += d[T];
  58. for(int i = T; i != S; i = edges[p[i]^].v){
  59. edges[p[i]].cap -= a[T];
  60. edges[p[i]^].cap += a[T];
  61. }
  62. }
  63. return cost;
  64. }
  65.  
  66. int pin[maxv],pout[maxv];
  67.  
  68. int main()
  69. {
  70. //freopen("in.txt","r",stdin);
  71. int v,e;
  72. int S = ; T = ;
  73. while(~scanf("%d%d",&v,&e)){
  74.  
  75. vcnt = ; ecnt = ;
  76. pin[] = pout[] = vcnt++;
  77. pin[v] = pout[v] = vcnt++;
  78. for(int i = ; i < v; i++) {
  79. pin[i] = vcnt++;
  80. pout[i] = vcnt++;
  81. }
  82. memset(head,-,sizeof(int)*(vcnt));
  83. AddEdge(S,pin[],,);
  84. AddEdge(pout[v],T,,);
  85. for(int i = ; i < v; i++) AddEdge(pin[i],pout[i],,);
  86. while(e--){
  87. int u,v,c; scanf("%d%d%d",&u,&v,&c);
  88. AddEdge(pout[u],pin[v],,c);
  89. }
  90. printf("%lld\n",MinCostMaxFlow());
  91. }
  92. return ;
  93. }

UVA - 1658 Admiral (最小费用最大流)的更多相关文章

  1. UVa 1658 Admiral(最小费用最大流)

    拆点费用流 --------------------------------------------------------------------- #include<cstdio> # ...

  2. UVa 1658 - Admiral(最小费用最大流 + 拆点)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  3. UVA 1658 海军上将(拆点法+最小费用限制流)

    海军上将 紫书P375 这题我觉得有2个难点: 一是拆点,要有足够的想法才能把这题用网络流建模,并且知道如何拆点. 二是最小费用限制流,最小费用最大流我们都会,但如果限制流必须为一个值呢?比如这题限制 ...

  4. uva 1658 Admiral (最小费最大流)

    uva 1658 Admiral 题目大意:在图中找出两条没有交集的线路,要求这两条线路的费用最小. 解题思路:还是拆点建图的问题. 首先每一个点都要拆成两个点.比如a点拆成a->a'.起点和终 ...

  5. UVA1658 Admiral 拆点法解决结点容量(路径不能有公共点,容量为1的时候) 最小费用最大流

    /** 题目:UVA1658 Admiral 链接:https://vjudge.net/problem/UVA-1658 题意:lrj入门经典P375 求从s到t的两条不相交(除了s和t外,没有公共 ...

  6. UVa 10806 Dijkstra,Dijkstra(最小费用最大流)

    裸的费用流.往返就相当于从起点走两条路到终点. 按题意建图,将距离设为费用,流量设为1.然后增加2个点,一个连向节点1,流量=2,费用=0;结点n连一条同样的弧,然后求解最小费用最大流.当且仅当最大流 ...

  7. UVA 10806 最小费用最大流

    终于可以写这道题的题解了,昨天下午纠结我一下下午,晚上才照着人家的题解敲出来,今天上午又干坐着想了两个小时,才弄明白这个问题. 题意很简单,给出一个无向图,要求从1 到 n最短路两次,但是两次不允许经 ...

  8. UVA - 1658 Admiral

    3. C - Admiral 题意:给定v(3<=v<=1000)个节点,e(3<=e<=10000)条边的又向加权图,求1->v的两条不相交的路径,使得权和最小. 思路 ...

  9. [板子]最小费用最大流(Dijkstra增广)

    最小费用最大流板子,没有压行.利用重标号让边权非负,用Dijkstra进行增广,在理论和实际上都比SPFA增广快得多.教程略去.转载请随意. #include <cstdio> #incl ...

随机推荐

  1. 3-C++程序的结构1.4

    共享数据的保护 对于既需要共享.又需要防止改变的数据应该声明为常量. 1.常引用 如果在声明引用时用const修饰,被声明的引用就是常引用.常引用所引用的对象不能被更新.声明形式如下: const 类 ...

  2. lightoj 1035【暴力】

    思路: 预处理一下素数数组,然后暴力计算就好了. 类似处理素数因子: #include <cstdio> #include <iostream> #include <st ...

  3. 笔记-JavaWeb学习之旅11

    请求转发:一种在服务器内部的资源跳转方式 使用步骤 1.通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path) ...

  4. java 阻塞队列(转)

    转自 http://ifeve.com/java-blocking-queue/ 1. 什么是阻塞队列? 阻塞队列(BlockingQueue)是一个支持两个附加操作的队列.这两个附加的操作是:在队列 ...

  5. TTM-To the moon

    传送门 查询历史版本,回到历史版本,这个题目显然是用主席树,好像就没了! 但是这里的修改是区间修改,众所周知主席树的空间复杂度是\(nlog(n)\)的,区间修改会导致主席树的开点到达一个相当恐怖的数 ...

  6. JIRA中的标记语言的语法参考

    前言 看到网上有的文章说JIRA是使用Textile这门标记语言,有些语法和Wikitext和Markdown相像.JIRA在2017年进行了一次大更新,某些语法可能和以前不大一样,这里纪录一下常用的 ...

  7. DRF教程5-API接口文档和接口测试

    配置 配置好,就可以访问web页面 pip install coreapi #安装依赖 from rest_framework.documentation import include_docs_ur ...

  8. 牛客练习赛42B(异或的性质)

    传送门 b^ c >= b - c,这个结论应该记住,我还在这里证过…… 这个题就用到了这个结论,假如当前答案集合为S,和为a,异或和为b,当前答案为a+b了.这时又读入个c,该不该加进来?a ...

  9. struts2的@Result annotation 如何添加params,并且在页面取值

    http://www.bubuko.com/infodetail-2492575.html .............................................. 标签:lai  ...

  10. centos7 更换jdk版本

    查看java版本   java -version 如果有java版本(如果没有直接看红色虚线以下的) 输入 rpm -qa | grep java会显示以下几条内容: ******* ******** ...