题目链接

给一个图, N个点, m条边, 每条边有权值, 从1走到n, 然后从n走到1, 一条路不能走两次,求最短路径。

如果(u, v)之间有边, 那么加边(u, v, 1, val), (v, u, 1, val), val是路的长度,代表费用, 1是流量。

  1. #include <iostream>
  2. #include <vector>
  3. #include <cstdio>
  4. #include <cstring>
  5. #include <algorithm>
  6. #include <cmath>
  7. #include <map>
  8. #include <set>
  9. #include <string>
  10. #include <queue>
  11. using namespace std;
  12. #define pb(x) push_back(x)
  13. #define ll long long
  14. #define mk(x, y) make_pair(x, y)
  15. #define lson l, m, rt<<1
  16. #define mem(a) memset(a, 0, sizeof(a))
  17. #define rson m+1, r, rt<<1|1
  18. #define mem1(a) memset(a, -1, sizeof(a))
  19. #define mem2(a) memset(a, 0x3f, sizeof(a))
  20. #define rep(i, a, n) for(int i = a; i<n; i++)
  21. #define ull unsigned long long
  22. typedef pair<int, int> pll;
  23. const double PI = acos(-1.0);
  24. const double eps = 1e-;
  25. const int mod = 1e9+;
  26. const int inf = ;
  27. const int dir[][] = { {, }, {, }, {, -}, {, } };
  28. const int maxn = 4e5+;
  29. int num, head[maxn*], s, t, n, m, nn, dis[maxn], flow, cost, cnt, cap[maxn], q[maxn], cur[maxn], vis[maxn];
  30. struct node
  31. {
  32. int to, nextt, c, w;
  33. node(){}
  34. node(int to, int nextt, int c, int w):to(to), nextt(nextt), c(c), w(w) {}
  35. }e[maxn*];
  36. int spfa() {
  37. int st, ed;
  38. st = ed = ;
  39. mem2(dis);
  40. ++cnt;
  41. dis[s] = ;
  42. cap[s] = inf;
  43. cur[s] = -;
  44. q[ed++] = s;
  45. while(st<ed) {
  46. int u = q[st++];
  47. vis[u] = cnt-;
  48. for(int i = head[u]; ~i; i = e[i].nextt) {
  49. int v = e[i].to, c = e[i].c, w = e[i].w;
  50. if(c && dis[v]>dis[u]+w) {
  51. dis[v] = dis[u]+w;
  52. cap[v] = min(c, cap[u]);
  53. cur[v] = i;
  54. if(vis[v] != cnt) {
  55. vis[v] = cnt;
  56. q[ed++] = v;
  57. }
  58. }
  59. }
  60. }
  61. if(dis[t] == inf)
  62. return ;
  63. cost += dis[t]*cap[t];
  64. flow += cap[t];
  65. for(int i = cur[t]; ~i; i = cur[e[i^].to]) {
  66. e[i].c -= cap[t];
  67. e[i^].c += cap[t];
  68. }
  69. return ;
  70. }
  71. int mcmf() {
  72. flow = cost = ;
  73. while(spfa())
  74. ;
  75. return cost;
  76. }
  77. void add(int u, int v, int c, int val) {
  78. e[num] = node(v, head[u], c, val); head[u] = num++;
  79. e[num] = node(u, head[v], , -val); head[v] = num++;
  80. }
  81. void init() {
  82. mem1(head);
  83. num = cnt = ;
  84. mem(vis);
  85. }
  86. void input() {
  87. int x, y, w;
  88. while(m--) {
  89. scanf("%d%d%d", &x, &y, &w);
  90. add(x, y, , w);
  91. add(y, x, , w);
  92. }
  93. add(s, , , );
  94. add(n, t, , );
  95. }
  96. int main()
  97. {
  98. while(~scanf("%d%d", &n, &m)) {
  99. init();
  100. s = , t = n+;
  101. input();
  102. int ans = mcmf();
  103. printf("%d\n", ans);
  104. }
  105. return ;
  106. }

poj 2135 Farm Tour 费用流的更多相关文章

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

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

  2. poj 2135 Farm Tour 【无向图最小费用最大流】

    题目:id=2135" target="_blank">poj 2135 Farm Tour 题意:给出一个无向图,问从 1 点到 n 点然后又回到一点总共的最短路 ...

  3. 网络流(最小费用最大流):POJ 2135 Farm Tour

    Farm Tour Time Limit: 1000ms Memory Limit: 65536KB This problem will be judged on PKU. Original ID: ...

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

    题目大意: 给你一个n个农场,有m条道路,起点是1号农场,终点是n号农场,现在要求从1走到n,再从n走到1,要求不走重复路径,求最短路径长度. 算法讨论: 最小费用最大流.我们可以这样建模:既然要求不 ...

  5. POJ 2135 Farm Tour (费用流)

    [题目链接] http://poj.org/problem?id=2135 [题目大意] 有一张无向图,求从1到n然后又回来的最短路 同一条路只能走一次 [题解] 题目等价于求从1到n的两条路,使得两 ...

  6. POJ 2135 Farm Tour [最小费用最大流]

    题意: 有n个点和m条边,让你从1出发到n再从n回到1,不要求所有点都要经过,但是每条边只能走一次.边是无向边. 问最短的行走距离多少. 一开始看这题还没搞费用流,后来搞了搞再回来看,想了想建图不是很 ...

  7. POJ 2135 Farm Tour &amp;&amp; HDU 2686 Matrix &amp;&amp; HDU 3376 Matrix Again 费用流求来回最短路

    累了就要写题解,近期总是被虐到没脾气. 来回最短路问题貌似也能够用DP来搞.只是拿费用流还是非常方便的. 能够转化成求满流为2 的最小花费.一般做法为拆点,对于 i 拆为2*i 和 2*i+1.然后连 ...

  8. poj 2135 Farm Tour【 最小费用最大流 】

    第一道费用流的题目--- 其实---还是不是很懂,只知道沿着最短路找增广路 建图 源点到1连一条容量为2(因为要来回),费用为0的边 n到汇点连一条容量为2,费用为0的边 另外的就是题目中输入的了 另 ...

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

    Description When FJ's friends visit him on the farm, he likes to show them around. His farm comprise ...

随机推荐

  1. sqoop安装与使用

    sqoop简介 sqoop名字是怎么来的?Sqoop: SQL-to-Hadoop 连接传统数据库和hadoop的桥梁,把关系型数据库的数据导入到hadoop系统(如HDFS,HBASE和hive中) ...

  2. poj2186 Popular Cows --- 强连通

    给一个有向图,问有多少结点是其它全部结点都能够到达的. 等价于,在一个有向无环图上,找出度为0 的结点.假设出度为0的结点仅仅有一个,那么这个就是答案.假设大于1个.则答案是0. 这题有环.所以先缩点 ...

  3. Ubuntu 13.04 小米2S连接Eclipse真机调试

    最近想继续将自己以前的一些Android程序代码进行改进和优化,遂将以前的代码在windows下导入eclipse工程,谁知导入后便eclipse假死,甚至windows资源管理器也动弹不得,诡异的是 ...

  4. 编码神器 Sublime Text 包管理工具及扩展大全

    Sublime Text 是程序员们公认的编码神奇,拥有漂亮的用户界面和强大的功能,例如代码缩略图,多重选择,快捷命令等.还可自定义键绑定,菜单和工具栏.Sublime Text 的主要功能包括:拼写 ...

  5. Linux下文件及目录的一些操作(附递归遍历目录源码)

    1.获取当前工作目录 #include <unistd.h> 1.char *getcwd(char *buf,size_t size); 2. 3.其中,buf为缓冲区地址,size为给 ...

  6. api文档生成工具 C#

    要为编写的程序编写文档,这是件费力气的事,如果能自动生成就好了. 不怕做不到,就怕想不到.这不,搜索到了Sandcastle 比较好的参考文章: 1.Sandcastle官方网址: http://sh ...

  7. SSM搭配中的web.xml的配置信息

    最近一段时间在自己学着搭建SSM框架的项目,其实这个项目自由自己不断尝试,不断失败,才能印象更深刻. 下面就说一下在项目中的web.xml的相关配置信息: <?xml version=" ...

  8. C++函数传值调用

    C++的函数的参数调用是传值方式. 想要改变传值调用,有引用和指针两种方式.其中,引用的实现机理也是通过一个指针,但是具体和指针传值的方式又不一样.具体见:C++中的指针与引用 对于指针传值,其实实际 ...

  9. 笔记-AndroidStudio开发环境的搭建

    首先当然是下载AndroidStudio,目前最新的稳定版是1.1 然后下载studio版本的sdk,如果用原装sdk,需要更新   安装的过程中会选择sdk的路径,此时如果已经解压了原装sdk,会进 ...

  10. Node.js 启动小结

    配置环境变量: cmd-------> 启动dyson服务 在项目的路径下 如open cmd进入open目录执行npm start命令 在浏览器下输入访问地址:http://localhost ...