题意:

给出一个有向带权图,求从起点到终点的两条不相交路径使得权值和最小。

分析:

第一次听到“拆点法”这个名词。

把除起点和终点以外的点拆成两个点i和i',然后在这两点之间连一条容量为1,费用为0的边。这样就保证了每个点最多经过一次。

其他有向边的容量也是1

然后求从起点到终点的流量为2(这样就保证了是两条路径)的最小费用流。

  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. const int maxn = + ;
  6. const int INF = ;
  7.  
  8. struct Edge
  9. {
  10. int from, to, cap, flow, cost;
  11. Edge(int u, int v, int c, int f, int w): from(u), to(v), cap(c), flow(f), cost(w) {}
  12. };
  13.  
  14. struct MCMF
  15. {
  16. int n, m;
  17. vector<Edge> edges;
  18. vector<int> G[maxn];
  19. int inq[maxn]; //是否在队列中
  20. int d[maxn]; //Bellman-Ford
  21. int p[maxn]; //上一条弧
  22. int a[maxn]; //可改进量
  23.  
  24. void Init(int n)
  25. {
  26. this->n = n;
  27. for(int i = ; i < n; ++i) G[i].clear();
  28. edges.clear();
  29. }
  30.  
  31. void AddEdge(int from, int to, int cap, int cost)
  32. {
  33. edges.push_back(Edge(from, to, cap, , cost));
  34. edges.push_back(Edge(to, from, , , -cost));
  35. m = edges.size();
  36. G[from].push_back(m-);
  37. G[to].push_back(m-);
  38. }
  39.  
  40. bool BellmanFord(int s, int t, int flow_limit, int& flow, int& cost)
  41. {
  42. for(int i = ; i < n; ++i) d[i] = INF;
  43. memset(inq, , sizeof(inq));
  44. d[s] = ; inq[s] = ; p[s] = ; a[s] = INF;
  45.  
  46. queue<int> Q;
  47. Q.push(s);
  48. while(!Q.empty())
  49. {
  50. int u = Q.front(); Q.pop();
  51. inq[u] = ;
  52. for(int i = ; i < G[u].size(); ++i)
  53. {
  54. Edge& e = edges[G[u][i]];
  55. if(e.cap > e.flow && d[e.to] > d[u] + e.cost)
  56. {
  57. d[e.to] = d[u] + e.cost;
  58. p[e.to] = G[u][i];
  59. a[e.to] = min(a[u], e.cap - e.flow);
  60. if(!inq[e.to]) { Q.push(e.to); inq[e.to] = ; }
  61. }
  62. }
  63. }
  64. if(d[t] == INF) return false;
  65. if(flow + a[t] > flow_limit) a[t] = flow_limit - flow;
  66. flow += a[t];
  67. cost += d[t] * a[t];
  68. for(int u = t; u != s; u = edges[p[u]].from)
  69. {
  70. edges[p[u]].flow += a[t];
  71. edges[p[u]^].flow -= a[t];
  72. }
  73. return true;
  74. }
  75.  
  76. int MincostMaxflow(int s, int t, int flow_limit, int& cost)
  77. {
  78. int flow = ; cost = ;
  79. while(flow < flow_limit && BellmanFord(s, t, flow_limit, flow, cost));
  80. return flow;
  81. }
  82. }g;
  83.  
  84. int main()
  85. {
  86. //freopen("in.txt", "r", stdin);
  87.  
  88. int n, m;
  89. while(scanf("%d%d", &n, &m) == && n)
  90. {
  91. g.Init(n*-);
  92. //2~n-1 i和i'的编号分别为1~n-2 n~2n-3
  93. for(int i = ; i <= n-; ++i) g.AddEdge(i-, n-+i, , );
  94. for(int i = ; i < m; ++i)
  95. { //连接a'->b
  96. int a, b, c;
  97. scanf("%d%d%d", &a, &b, &c);
  98. if(a != && a != n) a += n-; else a--;
  99. b--;
  100. g.AddEdge(a, b, , c);
  101. }
  102. int cost;
  103. g.MincostMaxflow(, n-, , cost);
  104. printf("%d\n", cost);
  105. }
  106.  
  107. return ;
  108. }

代码君

UVa 1658 (拆点法 最小费用流) Admiral的更多相关文章

  1. Acme Corporation UVA - 11613 拆点法+最大费用最大流(费用取相反数)+费用有正负

    /** 题目:Acme Corporation UVA - 11613 拆点法+最大费用最大流(费用取相反数)+费用有正负 链接:https://vjudge.net/problem/UVA-1161 ...

  2. Risk UVA - 12264 拆点法+最大流+二分 最少流量的节点流量尽量多。

    /** 题目:Risk UVA - 12264 链接:https://vjudge.net/problem/UVA-12264 题意:给n个点的无权无向图(n<=100),每个点有一个非负数ai ...

  3. UVa1658 Admiral(拆点法+最小费用流)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=51253 [思路] 固定流量的最小费用流. 拆点,将u拆分成u1和u ...

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

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

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

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

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

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

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

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

  8. 【uva 1658】Admiral(图论--网络流 最小费用最大流)

    题意:有个N个点M个边的有向加权图,求1~N的两条不相交路径(除了起点和终点外没有公共点),使得权和最小. 解法:不相交?也就是一个点只能经过一次,也就是我后面博文会讲的"结点容量问题&qu ...

  9. 紫书 习题 11-4 UVa 1660 (网络流拆点法)

    这道题改了两天-- 因为这道题和节点有关, 所以就用拆点法解决节点的容量问题. 节点拆成两个点, 连一条弧容量为1, 表示只能经过一次. 然后图中的弧容量无限. 然后求最小割, 即最大流, 即为答案. ...

随机推荐

  1. WPF解析TTF 字体

    偶遇需要自己解析 TTF 字体并显示,此做... using System; using System.Collections.Generic; using System.Drawing.Text; ...

  2. CSS3属性box-shadow使用教程,css3box-shadow

    CSS3的box-shadow属性可以让我们轻松实现图层阴影效果.我们来实战详解一下这个属性. 1. box-shadow属性的浏览器兼容性先来看一个这个属性的浏览器兼容性: Opera: 不知道是从 ...

  3. 中国餐馆过程(CRP)

    查如何事先确定聚类簇数目发现的,是对狄利克雷过程的(DP)的一种解释. 假设一个中国餐馆有无限的桌子,第一个顾客到来之后坐在第一张桌子上.第二个顾客来到可以选择坐在第一张桌子上,也可以选择坐在一张新的 ...

  4. PAT-乙级-1055. 集体照 (25)

    1055. 集体照 (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 拍集体照时队形很重要,这里对给定的N ...

  5. Linux 终端访问 FTP 及 上传下载 文件

    今天同事问我一个问题,在Linux 下访问FTP,并将文件上传上去. 我之前一直是用WinSCP工具的. 先将文件从linux copy到windows下,然后在传到ftp上.google 一下. 方 ...

  6. VC6.0环境安装STLport-5.2.1

    今天安装STLport,网上搜资料安装好久,都不行,因为STLport 的版本不对,我这是STLport-5.2.1新版本. (注意:下面的步骤都在一个cmd里操作,很简单的原因:环境变量啊) 1.首 ...

  7. 企业运营对 DevOps 的「傲慢与偏见」

    摘要:出于各种原因,并非所有人都信任 DevOps .有些人觉得 DevOps 只不过给开发者改善产品提供了一个途径而已,还有的人觉得 DevOps 是一堆悦耳的空头支票,甚至有人认为 DevOps ...

  8. SPOJ NSUBSTR Substrings 后缀自动机

    人生第一道后缀自动机,总是值得纪念的嘛.. 后缀自动机学了很久很久,先是看CJL的论文,看懂了很多概念,关于right集,关于pre,关于自动机的术语,关于为什么它是线性的结点,线性的连边.许多铺垫的 ...

  9. 【QT】计时器制作

    应小伙伴的要求,做一个小计时器.功能是点击开始就从00:00:00开始计时,点击暂停就暂停计时,点击停止就停止计时. 界面如上图,使用ui设计师直接拖的.按钮和图标的图片都是网上下载的.用美图秀秀抠成 ...

  10. POJ 1663

    #include<iostream>//cheng da cai zi using namespace std; int main() { int time; cin>>tim ...