题意:

从出发点到目的地往返一次,道路i连接着ai号和bi号,长度为ci。同一条路只能走一次,求最小路径长度。

分析:

如果没有往返,那么就是简单的最短路问题。如果规定严格从左到右,那么就是简单的双调旅行商问题。对于本题,同样还是将往返看成是从出发地开始的两条没有公共边的路径,便可以转化为求流量为2的最小费用流了~注意边为无向边

代码:

  1. #include<cstdio>
  2. #include<vector>
  3. #include<iostream>
  4. #include<queue>
  5. using namespace std;
  6. #define se second
  7. #define fi first
  8. typedef pair<int, int>pii;//first 顶点距离,secon顶点编号
  9. struct edge{int to, cap, cost, rev;};
  10. const int maxn = 20005, INF =0x3fffffff;
  11. int V, s, t;
  12. vector<edge>G[maxn];
  13. int dist[maxn], prevv[maxn], preve[maxn], h[maxn];//h记录顶点的势
  14. void add_edge(int from, int to, int cap, int cost)
  15. {
  16. G[from].push_back((edge){to, cap, cost, G[to].size()});
  17. G[to].push_back((edge){from, 0, -cost, G[from].size() - 1});
  18. }
  19. int min_cost_flow(int s, int f)
  20. {
  21. int res = 0;
  22. fill(h, h + V + 1, 0);
  23. while(f > 0){
  24. priority_queue<pii, vector<pii>, greater<pii> >que;
  25. fill(dist, dist + V + 1, INF);
  26. dist[s] = 0;
  27. que.push(pii(0, s));
  28. while(!que.empty()){
  29. pii p = que.top();que.pop();
  30. int v = p.se;
  31. if(dist[v] < p.fi) continue;
  32. for(int i = 0; i < G[v].size(); i++){
  33. edge &e = G[v][i];
  34. if(e.cap>0&&dist[e.to]>dist[v] + e.cost + h[v] - h[e.to]){
  35. dist[e.to] = dist[v] + e.cost + h[v] - h[e.to];
  36. prevv[e.to] = v; preve[e.to] = i;
  37. que.push(pii(dist[e.to], e.to));
  38. }
  39. }
  40. }
  41. if(dist[t] == INF) return -1;
  42. for(int i = 1; i <= V; i++) h[i] +=dist[i];
  43. int d = f;
  44. for(int v = t; v != s; v = prevv[v]){
  45. d = min(d, G[prevv[v]][preve[v]].cap);
  46. }
  47. f -= d;
  48. res += d * h[t];
  49. for(int v = t; v!= s; v = prevv[v]){
  50. edge &e = G[prevv[v]][preve[v]];
  51. e.cap -= d;
  52. G[v][e.rev].cap += d;
  53. }
  54. }
  55. return res;
  56. }
  57. int main (void)
  58. {
  59. int m;scanf("%d%d",&V, &m);
  60. int a, b, c;
  61. for(int i = 0; i < m; i++){
  62. scanf("%d%d%d",&a, &b, &c);
  63. add_edge(a, b, 1, c);
  64. add_edge(b, a, 1, c);
  65. }
  66. s = 1, t = V;
  67. printf("%d\n",min_cost_flow(s,2));
  68. }

POJ 2135_Farm Tour的更多相关文章

  1. POJ Farm Tour

    Farm Tour 题目: 约翰有N块地,家在1号,而N号是个仓库.农场内有M条道路(双向的),道路i连接这ai号地和bi号地,长度为ci. 约翰希望依照从家里出发,经过若干地后达到仓库.然后再返回家 ...

  2. 最小费用最大流模板(POJ 2135-Farm Tour)

    最近正好需要用到最小费用最大流,所以网上就找了这方面的代码,动手写了写,先在博客里存一下~ 代码的题目是POJ2135-Farm Tour 需要了解算法思想的,可以参考下面一篇文章,个人觉得有最大流基 ...

  3. UVA 1347(POJ 2677) Tour(双色欧几里德旅行商问题)

    Description John Doe, a skilled pilot, enjoys traveling. While on vacation, he rents a small plane a ...

  4. POJ 2677 Tour

    题意:双调欧几里得旅行商问题.算法导论15-1题,从最左边的点严格从左走到右再从右走到左回到起点,所有点都要走且只走一次,求最短路径. 解法:定义dp[i][j]表示从i走到j的双调路径,分为两种情况 ...

  5. ACM - 动态规划专题 题目整理

    CodeForces 429B  Working out 预处理出从四个顶点到某个位置的最大权值,再枚举相遇点,相遇的时候只有两种情况,取最优解即可. #include<iostream> ...

  6. [SinGuLaRiTy] 动态规划题目复习

    [SinGuLaRiTy-1026] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. [UVA 1025] A Spy in the Metr ...

  7. POJ 1637 Sightseeing tour (混合图欧拉路判定)

    Sightseeing tour Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 6986   Accepted: 2901 ...

  8. POJ 1637 Sightseeing tour(最大流)

    POJ 1637 Sightseeing tour 题目链接 题意:给一些有向边一些无向边,问能否把无向边定向之后确定一个欧拉回路 思路:这题的模型很的巧妙,转一个http://blog.csdn.n ...

  9. POJ 2135 Farm Tour (网络流,最小费用最大流)

    POJ 2135 Farm Tour (网络流,最小费用最大流) Description When FJ's friends visit him on the farm, he likes to sh ...

随机推荐

  1. ajax post 提交数据到服务端时中文乱码解决方法

    get 方式提交数据到服务端不会乱码,但对数据量有限制;post 可以提交大数据量,但中文会发生乱码,解决方法: 在JS上用使用 encodeURIComponent 对字符编码处理: student ...

  2. JAVA高级特性反射和注解

    反射: 枚举反射泛型注解.html34.3 KB 反射, 主要是指通过类加载, 动态的访问, 检测和修改类本身状态或行为的一种能力, 并能根据自身行为的状态和结果, 调整或修改应用所描述行为的状态和相 ...

  3. AJPFX关于增强for的概述和使用(foreach)

    增强for的概述和使用(foreach)1.增强for的概述和使用(foreach)                格式:                for(数组或者Collection集合中元素 ...

  4. Mac下部署与启动STF

    一.stf在Mac下的部署1.安装Java及jdk可自己谷歌(如果不能自建云梯)2.安装nodejs包(我是直接在官网下载的LTS版本) • Node.js v8.12.0 to /usr/local ...

  5. pandas之groupby分组与pivot_table透视表

    zhuanzi: https://blog.csdn.net/qq_33689414/article/details/78973267 pandas之groupby分组与pivot_table透视表 ...

  6. vscode增加sftp扩展

    下载 sftp-sync 扩展插件 填写配置 快捷键 ctrl+shift+P 打开指令窗口,输入sftp:config,回车,就会在当前工作工程的.vscode文件夹下生成一个sftp.json文件 ...

  7. JAVA 学习笔记 - 反射机制

    1.   JAVA反射机制的概念 2. 怎样实例化一个 Class对象 Class.forName(包名.类名); 对象.getClass(); 类.class; ================== ...

  8. 网络爬虫之框架(Scrapy)

    Scrapy爬虫框架 爬虫框架是实现爬虫功能的一个软件结构和功能组件集合. 爬虫框架是一个半成品,能够帮助用户实现专业网络爬虫. Scrapy爬虫框架结构:

  9. 实训day01 python基础

    一.编程语言 编程语言:可以被计算机所识别的表达方式. 编程:程序员通过编程语言将自己的想法编写出来,产生的结果就是包含字符的文件. 其中,只有程序在运行时,其中的字符才有特定的语法意义. 二.计算机 ...

  10. WebDriver的多浏览器测试的浏览器驱动程序

    1.在使用IE浏览器进行WebDriver自动化测试之前,需要从http://docs.seleniumhq.org/download/网站上下载一个WebDriver链接IE浏览器的驱动程序,文件名 ...