题意:给定一个无向图,从1走到n再从n走回1,每个边只能走一遍,求最短路

题解:可以定义一个源点s,和一个汇点t

s和1相连容量为2,费用为0,

t和n相连容量为2,费用为0

然后所用的边的容量都定为1,跑一遍最小费用最大流即可

  1 #include<cstdio>
  2 #include<cstdlib>
  3 #include<algorithm>
  4 #include<cstring>
  5 #include<queue>
  6 #include<vector>
  7 #define MAXN 1000+10
  8 #define INF 0x7f7f7f7f
  9 #define ll long long
 10 using namespace std;
 11 struct Edge{
 12     int from,to,cap,flow,cost;
 13     Edge(int u=0,int v=0,int c=0,int f=0,int w=0){
 14         from=u,to=v,cap=c,flow=f,cost=w;
 15     }
 16 };
 17 int n,m;
 18 vector<Edge> edges;
 19 vector<int> G[MAXN];
 20 int d[MAXN];
 21 int b[MAXN];
 22 int a[MAXN];
 23 int p[MAXN];
 24 void AddEdge(int u,int v,int cap,int cost){
 25     edges.push_back(Edge(u,v,cap,0,cost));
 26     edges.push_back(Edge(v,u,0,0,-cost));
 27     int t=edges.size();
 28     G[u].push_back(t-2);
 29     G[v].push_back(t-1);
 30 }
 31 int SPFA(int s,int t,int &flow,ll &cost){
 32     memset(d,0x7f,sizeof(d));
 33     memset(b,0,sizeof(b));
 34
 35     queue<int> q;
 36     q.push(s);
 37     b[s]=1;
 38     d[s]=0;
 39     a[s]=INF;
 40     p[s]=0;
 41
 42     while(!q.empty()){
 43         int x=q.front(); q.pop();
 44         b[x]=0;
 45         for(int i=0;i<G[x].size();i++){
 46             Edge& e=edges[G[x][i]];
 47             if(e.cap>e.flow&&d[e.to]>d[x]+e.cost){
 48                 d[e.to]=d[x]+e.cost;
 49                 a[e.to]=min(a[x],e.cap-e.flow);
 50                 p[e.to]=G[x][i];
 51                 if(!b[e.to]){
 52                     b[e.to]=1;
 53                     q.push(e.to);
 54                 }
 55             }
 56         }
 57     }
 58     if(d[t]==INF){
 59         return 0;
 60     }
 61
 62     flow+=a[t];
 63     cost+=1LL*a[t]*d[t];
 64     for(int x=t;x!=s;x=edges[p[x]].from){
 65         edges[p[x]].flow+=a[t];
 66         edges[p[x]^1].flow-=a[t];
 67     }
 68     return 1;
 69 }
 70 ll MincostMaxflow(int s,int t){
 71     int flow=0;
 72     ll cost=0;
 73     while(SPFA(s,t,flow,cost));
 74     return cost;
 75 }
 76 void solve(){
 77     printf("%lld\n",MincostMaxflow(1,n+2));
 78 }
 79 void init(){
 80     memset(a,0,sizeof(a));
 81     memset(p,0,sizeof(p));
 82     edges.clear();
 83     for(int i=0;i<=n;i++){
 84         G[i].clear();
 85     }
 86     for(int i=1;i<=m;i++){
 87         int u,v,w;scanf("%d%d%d",&u,&v,&w);
 88         u++,v++;
 89         AddEdge(u,v,1,w);
 90         AddEdge(v,u,1,w);
 91     }
 92     AddEdge(1,2,2,0);
 93     AddEdge(n+1,n+2,2,0);
 94 }
 95 int main()
 96 {
 97     while(~scanf("%d%d",&n,&m)){
 98         init();
 99         solve();
100     }
101     return 0;
102 }

转载于:https://www.cnblogs.com/w-h-h/p/7836241.html

POJ2135:Farm Tour相关推荐

  1. POJ-2135 Farm Tour 最小费用流

    题目链接:http://poj.org/problem?id=2135 很容易看出来时最小费用流,但这里要注意是无向边,所以要建立两条边.为了满足退流时,花费还是最小,反向边的花费要为相反数. 1 / ...

  2. 骑士周游算法 c语言_C语言经典算法04--骑士走棋盘(骑士旅游:Knight tour)

    说明:骑士旅游(Knight tour)在十八世纪初倍受数学家与拼图迷的注意,它什么时候被提出已不可考,骑士的走法为西洋棋的走法,骑士可以由任一个位置出发,它要如何走完[所有的位置? 解法:骑士的走法 ...

  3. 6.824:FaRM笔记

    Spanner针对全球范围的分布式数据中心来实现高效的分布式事务,为了解决远距离的二阶段提交的巨大延迟,它通过让服务器间同步时钟来优化只读事务.经过优化后,一个读写型是事务根据数据中心的距离将花费10 ...

  4. POJ 2135 Farm Tour (费用流)

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

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

    题目链接:点击查看 题目大意:给出一个由n个点和m条边组成的无向图,每条边都有权值,求点1->点n->点1的最短路,且要求每条路至多经过一次,并使得途径的权值和最小 题目分析:虽然题目要求 ...

  6. POJ 2135 Farm Tour 最小费用流

    两条路不能有重边,既每条边的容量是1.求流量为2的最小费用即可. //#pragma comment(linker, "/STACK:1024000000,1024000000") ...

  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 (最小费用最大流)

    Description 给出一张\(N\)个点\(M\)条边的带权无向图,结点编号从\(1\)到\(N\),求从\(1\)到\(N\)再到\(1\)的最短路,每条边最多走一次. Input 第一行给出 ...

  9. 转载:Hdu 题目分类

    原址点击 基础题:1000.1001.1004.1005.1008.1012.1013.1014.1017.1019.1021.1028.1029. 1032.1037.1040.1048.1056. ...

  10. 网络流:最小费用最大流问题

    前置知识:最大流问题 最小费用最大流问题: 在最大流问题基础上,为每条边赋值单位流量的花费.求解保证最大流时,最小花费为多少.(因为最大流可以有多种流分配方案) 以EK算法为基础,在bfs时增加求最短 ...

最新文章

  1. 【MongoDB学习之一】初始MongoDB
  2. mysql多数据源切换_Springboot项目实现Mysql多数据源切换的完整实例
  3. 从 OSS 装载数据到 PostgreSQL
  4. 网络获取json数据并解析
  5. idea 创建 Maven+Hibernate项目
  6. Linux Tomcat 简介
  7. OpenCV极线epipolar lines的实例(附完整代码)
  8. Apache Spark:更改架构之前必须解决的5个陷阱
  9. 支付宝:“我的小程序”用户访问量一周激增165%
  10. python数据结构剑指offer-构建乘积数组
  11. c语言开发桌面应用合适吗,什么编程语言比较适合开发桌面应用程序?
  12. 颤抖吧,理科生们,让你们看看文科帝!
  13. 高德地图获取坐标距离_高德地图获取两个经纬度点间直线距离JS/PHP/SQL代码
  14. 一份很哇塞的产品经理述职报告(附PPT下载)
  15. 如何检测时间序列中的异方差(Heteroskedasticity)
  16. 如何快速自动生成并定制报表
  17. 用C语言开发NES游戏(CC65) 简介
  18. 解决CUDA error: no kernel image is available for execution on the device
  19. aria2网页服务器错误,配置aria2服务器错误
  20. 记英语单词的有效方法就那么几个,别整一些花里胡哨的

热门文章

  1. version GLIBC_2.28 not found
  2. 坐高铁只能用身份证了?
  3. 为何吾博客周排名没有数字显示?
  4. 诚心劝言:自养动物不杀
  5. 正反物质相撞湮灭,是因为电荷因素吗?
  6. C中处理Python的Numpy数组的代码范例
  7. 64位程序如何调用32位dll(简单解决方案 )
  8. 360 android 应用市场,360应用市场
  9. mysql自带的全文索引_MySql全文索引详解
  10. python 怎么算l2范数_“火车过桥”“火车会车”和“火车超车”问题怎么解?图形很直观...