Farm Tour

题目:

约翰有N块地,家在1号,而N号是个仓库。农场内有M条道路(双向的),道路i连接这ai号地和bi号地,长度为ci。

约翰希望依照从家里出发,经过若干地后达到仓库。然后再返回家中。假设要求往返不能经过同一条道路两次,求參观路线总长度最小值。

算法分析:

用最短路求解然后在删除第一次最短路中的边在求解一次最短路。这样是否可行?应该立即就能找到反例证明该方法不能总得到最优结果吧。

于是我们放弃把问题当作去和回的这样的想法,转而将问题当作求从1号顶点到N号顶点的两条没有公共边的路径有怎样?这样转换之后。不就是求流量为2的最小费用了,由于道路是双向的。

#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <cstdio>
#include <cstring>
using namespace std; /* 流量限制为f下。求解最小费用
时间复杂度:O(F mlogn) */
typedef pair<int,int> P;
const int INF = 1 << 30;
const int MAXN = 1000 + 10; struct Edge{
int to,cap,cost,rev;
Edge(){};
Edge(int _to,int _cap,int _cost,int _rev)
:to(_to),cap(_cap),cost(_cost),rev(_rev){};
}; int V; //顶点
int N,M,S,T;
vector<Edge> G[MAXN];
int h[MAXN]; //顶点的势
int dist[MAXN]; //最短距离
int prevv[MAXN],preve[MAXN]; //最短路中德前驱节点和相应的边 void init(){
S = 1; T = N; V = T + 1;
for(int i = 0;i <= V;++i)
G[i].clear();
} //从图中添加一条从from到to容量为cap费用为cost的边
void addEdge(int from,int to,int cap,int cost){
G[from].push_back(Edge(to,cap,cost,G[to].size()));
G[to].push_back(Edge(from,0,-cost,G[from].size() - 1));
} //求解从s到t流量为f的最小费用流
//假设没有流量为f的流。则返回-1
int min_cost_flow(int s,int t,int f){ //s:起点 t:终点 f:流量限制
int res = 0;
fill(h,h + V,0); //初始化h
while(f > 0){ //使用Dijkstra算法更新h
priority_queue<P,vector<P>,greater<P> > Q;
fill(dist,dist + V,INF);
dist[s] = 0;
Q.push(P(0,s));
while(!Q.empty()){
P p = Q.top(); Q.pop();
int v = p.second;
if(dist[v] < p.first) continue;
for(int i = 0;i < G[v].size();++i){
Edge& e = G[v][i];
int tmp = dist[v] + e.cost + h[v] - h[e.to];
if(e.cap > 0 && dist[e.to] > tmp){
dist[e.to] = tmp;
prevv[e.to] = v;
preve[e.to] = i;
Q.push(P(dist[e.to],e.to));
}
}
} //while //不能增广
if(dist[t] == INF){
return -1;
}
for(int v = 1;v <= V;++v) h[v] += dist[v];
int d = f;
for(int v = t;v != s;v = prevv[v]){
d = min(d,G[prevv[v]][preve[v]].cap);
}
f -= d;
res += d * h[t];
for(int v = t; v != s;v = prevv[v]){
Edge& e = G[prevv[v]][preve[v]];
e.cap -= d;
G[v][e.rev].cap += d;
}
}
return res;
} int main()
{
//freopen("Input.txt","r",stdin); while(~scanf("%d%d",&N,&M)){
init();
int a,b,c;
for(int i = 0;i < M;++i){
scanf("%d%d%d",&a,&b,&c);
addEdge(a,b,1,c);
addEdge(b,a,1,c);
}
printf("%d\n",min_cost_flow(S,T,2));
}
return 0;
}

版权声明:本文博主原创文章,博客,未经同意不得转载。

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

    Farm Tour Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 17230   Accepted: 6647 Descri ...

  5. POJ2135 Farm Tour

      Farm Tour Time Limit: 2MS   Memory Limit: 65536KB   64bit IO Format: %I64d & %I64u Description ...

  6. POJ2135 Farm Tour —— 最小费用最大流

    题目链接:http://poj.org/problem?id=2135 Farm Tour Time Limit: 1000MS   Memory Limit: 65536K Total Submis ...

  7. [网络流]Farm Tour(费用流

    Farm Tour 题目描述 When FJ's friends visit him on the farm, he likes to show them around. His farm compr ...

  8. Farm Tour(最小费用最大流模板)

    Farm Tour Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 18150   Accepted: 7023 Descri ...

  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. UITableView-FDTemplateLayoutCell自动计算UITableView高度的使用

    基本应用如果你有self-satisfied cell,那么你应该做的是:#import "UITableView+FDTemplateLayoutCell.h"- (CGFloa ...

  2. 纯js制作遮罩层对话框 -- g皓皓

    //本文支持js在线工具测试.转载请注明出处. <htmlxmlns="http://www.w3.org/1999/xhtml"> <head> < ...

  3. 关于json.ajax ,php的那点事

    $.ajax({ type:'post'/'get'  两者选其一 url:    地址 data: "newdata="+newdata+"&olddata=& ...

  4. Asp.net mvc中Controller的返回值

    (1)EmptyResult:当用户有误操作或者是图片防盗链的时候,这个EmptyResult就可以派上用场,返回它可以让用户啥也看不到内容,通过访问浏览器端的源代码,发现是一个空内容: public ...

  5. Unity扩展编辑器--类型3:Custom Editors

    Custom Editors 加速游戏制作过程的关键是为哪些频繁使用的组件创建自定义的编辑器,为了举例,我们将会使用下面这个极其简单的脚本进行讲解,它的作用是始终保持一个对象注视某一点. public ...

  6. 转:精美jQuery插件及源码 前端开发福利

    原文来自于:http://www.html5tricks.com/pretty-jquery-plugin.html jQuery是一个非常不错的javascript框架,很多前端开发者喜欢的原因不仅 ...

  7. Java进阶代码

    本文重在温习……不过初学以及进阶高手不可错过 1.  public static void arraycopy(全小写)(object src,int srcPos,object dest,int d ...

  8. About Technology Research

    做了大量的了解(research).尝试(experimental).探索(exploration).摸索(groping); 解决方案的选择时,要做前期的调研和Demo尝试. 对各方面的技术都做了一 ...

  9. 一步一步学习SignalR进行实时通信_9_托管在非Web应用程序

    原文:一步一步学习SignalR进行实时通信_9_托管在非Web应用程序 一步一步学习SignalR进行实时通信\_9_托管在非Web应用程序 一步一步学习SignalR进行实时通信_9_托管在非We ...

  10. 最短路算法模板合集(Dijkstar,Dijkstar(优先队列优化), 多源最短路Floyd)

    再开始前我们先普及一下简单的图论知识 图的保存: 1.邻接矩阵. G[maxn][maxn]; 2.邻接表 邻接表我们有两种方式 (1)vector< Node > G[maxn]; 这个 ...