题意:有n个机器,机器之间有m条连线,我们需要判断机器0到n-1是否存在两条线路,存在输出最小费用。

思路:我们把0连接超级源点,n-1连接超级汇点,两者流量都设为2,其他流量设为1,那么只要最后我们能找到超级汇点和超级源点的流量为2就说明有两条路,输出最小值。

代码:

  1. #include<cstdio>
  2. #include<vector>
  3. #include<stack>
  4. #include<queue>
  5. #include<cstring>
  6. #include<string>
  7. #include<cmath>
  8. #include<cstdlib>
  9. #include<algorithm>
  10. #define ll long long
  11. const int maxn = 1000+5;
  12. const int maxm = 10000+5;
  13. const int MOD = 1e7;
  14. const int INF = 1 << 25;
  15. using namespace std;
  16. struct Edge{
  17. int to,next,cap,flow,cost;
  18. }edge[maxm];
  19. int head[maxn],tot;
  20. int pre[maxn],dis[maxn];
  21. bool vis[maxn];
  22. int N,M;
  23. void init(){
  24. N = maxn;
  25. tot = 0;
  26. memset(head,-1,sizeof(head));
  27. }
  28. void addEdge(int u,int v,int cap,int cost){
  29. edge[tot].to = v;
  30. edge[tot].cap = cap; //容量
  31. edge[tot].flow = 0;
  32. edge[tot].cost = cost;
  33. edge[tot].next = head[u];
  34. head[u] = tot++;
  35. edge[tot].to = u;
  36. edge[tot].cap = 0;
  37. edge[tot].flow = 0;
  38. edge[tot].cost = -cost;
  39. edge[tot].next = head[v];
  40. head[v] = tot++;
  41. }
  42. bool spfa(int s,int t){
  43. queue<int> q;
  44. for(int i = 0;i < N;i++){
  45. dis[i] = INF;
  46. vis[i] = false;
  47. pre[i] = -1;
  48. }
  49. dis[s] = 0;
  50. vis[s] = true;
  51. q.push(s);
  52. while(!q.empty()){
  53. int u = q.front();
  54. q.pop();
  55. vis[u] = false;
  56. for(int i = head[u];i != -1;i = edge[i].next){
  57. int v = edge[i].to;
  58. if(edge[i].cap > edge[i].flow && dis[v] > dis[u] + edge[i].cost){
  59. dis[v] = dis[u] + edge[i].cost;
  60. pre[v] = i;
  61. if(!vis[v]){
  62. vis[v] = true;
  63. q.push(v);
  64. }
  65. }
  66. }
  67. }
  68. return pre[t] != -1;
  69. }
  70. int MCMF(int s,int t,int &cost){
  71. int flow = 0;
  72. cost = 0;
  73. while(spfa(s,t)){
  74. int MIN = INF;
  75. for(int i = pre[t];i != -1;i = pre[edge[i^1].to]){
  76. if(MIN > edge[i].cap - edge[i].flow){
  77. MIN = edge[i].cap - edge[i].flow;
  78. }
  79. }
  80. for(int i = pre[t];i != -1; i = pre[edge[i^1]. to]){
  81. edge[i]. flow += MIN;
  82. edge[i^1]. flow -= MIN;
  83. cost += edge[i]. cost * MIN;
  84. }
  85. flow += MIN;
  86. }
  87. return flow;
  88. }
  89. int main(){
  90. int n,m,Case = 1;
  91. while(scanf("%d%d",&n,&m) && n+m){
  92. init();
  93. addEdge(0,1,2,0);
  94. addEdge(n,n + 1,2,0);
  95. int u,v,w;
  96. while(m--){
  97. scanf("%d%d%d",&u,&v,&w);
  98. addEdge(u + 1,v + 1,1,w);
  99. }
  100. int cost;
  101. int flow = MCMF(0,n + 1,cost);
  102. if(flow == 2)
  103. printf("Instance #%d: %d\n",Case++,cost);
  104. else
  105. printf("Instance #%d: Not possible\n",Case++);
  106. }
  107. return 0;
  108. }
  109. /*
  110. 2 1
  111. 0 1 20
  112. 2 3
  113. 0 1 20
  114. 0 1 20
  115. 1 0 10
  116. 4 6
  117. 0 1 22
  118. 1 3 11
  119. 0 2 14
  120. 2 3 26
  121. 0 3 43
  122. 0 3 58
  123. 0 0
  124. Instance #1: Not possible
  125. Instance #2: 40
  126. Instance #3: 73
  127. */

UVALive - 2927 "Shortest" pair of paths(最小费用最大流)题解的更多相关文章

  1. [poj] 3068 "Shortest" pair of paths || 最小费用最大流

    [原题](http://poj.org/problem?id=3068) 给一个有向带权图,求两条从0-N-1的路径,使它们没有公共点且边权和最小 . //是不是像传纸条啊- 是否可行只要判断最后最大 ...

  2. UVALIVE 2927 "Shortest" pair of paths

    裸的费用流.一开始因为这句话还觉得要拆点 样例行不通不知道这句话干啥用的.Further, the company cannot place the two chemicals in same dep ...

  3. 2018.06.27"Shortest" pair of paths(费用流)

    "Shortest" pair of paths Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 1589 A ...

  4. POJ3068 "Shortest" pair of paths 【费用流】

    POJ3068 "Shortest" pair of paths Description A chemical company has an unusual shortest pa ...

  5. TZOJ 4712 Double Shortest Paths(最小费用最大流)

    描述 Alice and Bob are walking in an ancient maze with a lot of caves and one-way passages connecting ...

  6. POJ 3068 "Shortest" pair of paths(费用流)

    [题目链接] http://poj.org/problem?id=3068 [题目大意] 给出一张图,要把两个物品从起点运到终点,他们不能运同一条路过 每条路都有一定的费用,求最小费用 [题解] 题目 ...

  7. P3381 【模板】最小费用最大流 题解

    CSDN同步 原题链接 前置知识: 从三种算法剖析网络流本质 简要题意: 给定网络图,求图的最大流,以及流量为最大流时的最小费用. 现在假设你们看了那篇网络流博客之后,所有人都会了 \(\text{E ...

  8. 连续最短路算法(Successive Shortest Path)(最小费用最大流)

    #include <cstdio> #include <cstring> #include <queue> #include <vector> #inc ...

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

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

随机推荐

  1. Egret打包App 短暂黑屏解决方案 (Egret4.1.0)

    论坛已经有人解决:http://bbs.egret.com/forum.php?mod=viewthread&tid=30288&highlight=app%2B%E9%BB%91%E ...

  2. Python GUI--Tkinter实践

    之前写了Testlink自动执行程序,现使用Tkinter加上GUI试试,想要实现如下图功能 可以实现通过选择要执行的url及报告url自动执行用例,或可以直接写报告结果内容 因项目原因,只列出部分代 ...

  3. 重新来认识你的老朋友Spring框架

    欢迎查看Java开发之上帝之眼系列教程,如果您正在为Java后端庞大的体系所困扰,如果您正在为各种繁出不穷的技术和各种框架所迷茫,那么本系列文章将带您窥探Java庞大的体系.本系列教程希望您能站在上帝 ...

  4. postgresql架构基础(转)-(1)

    PostgreSQL使用一种客户端/服务器的模型.一次PostgreSQL会话由下列相关的进程(程序)组成: 一个服务器进程,它管理数据库文件.接受来自客户端应用与数据库的联接并且代表客户端在数据库上 ...

  5. java之面向对象三大特征(封装,继承,多态)

    一.封装 封装是指将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象内部信息,而是通过该类提供的对外方法进行内部信息的操作和访问. 封装可以达到以下目的: 1)隐藏类的实现细节 2)让使用者只 ...

  6. ajax 实现单选按钮的选中值

    <input type=" checked="checked" /> 男     <input type="/>女 $(".s ...

  7. How many ways??---hdu2157(矩阵快速幂)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2157   题意:有一个有向图,含有n个节点,m条边,Q个询问,每个询问有 s,t,p,求 s 到 t ...

  8. Bungee Jumping---hdu1155(物理题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1155 题目很长,但是很容易理解,就是人从高s的桥上跳下来,手拉着长为l的绳子末端,如果绳子太短那么人将 ...

  9. 商铺项目(Logback配置与使用)

    <?xml version="1.0" encoding="utf-8"?> <configuration debug="false ...

  10. go-005-变量、常量

    概述 变量来源于数学,是计算机语言中能储存计算结果或能表示值抽象概念.变量可以通过变量名访问. Go 语言变量名由字母.数字.下划线组成,其中首个字母不能为数字. 声明变量的一般形式是使用 var 关 ...