POJ Farm Tour
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的更多相关文章
- POJ 2135 Farm Tour (网络流,最小费用最大流)
POJ 2135 Farm Tour (网络流,最小费用最大流) Description When FJ's friends visit him on the farm, he likes to sh ...
- poj 2135 Farm Tour 【无向图最小费用最大流】
题目:id=2135" target="_blank">poj 2135 Farm Tour 题意:给出一个无向图,问从 1 点到 n 点然后又回到一点总共的最短路 ...
- 网络流(最小费用最大流):POJ 2135 Farm Tour
Farm Tour Time Limit: 1000ms Memory Limit: 65536KB This problem will be judged on PKU. Original ID: ...
- poj 2351 Farm Tour (最小费用最大流)
Farm Tour Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 17230 Accepted: 6647 Descri ...
- POJ2135 Farm Tour
Farm Tour Time Limit: 2MS Memory Limit: 65536KB 64bit IO Format: %I64d & %I64u Description ...
- POJ2135 Farm Tour —— 最小费用最大流
题目链接:http://poj.org/problem?id=2135 Farm Tour Time Limit: 1000MS Memory Limit: 65536K Total Submis ...
- [网络流]Farm Tour(费用流
Farm Tour 题目描述 When FJ's friends visit him on the farm, he likes to show them around. His farm compr ...
- Farm Tour(最小费用最大流模板)
Farm Tour Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 18150 Accepted: 7023 Descri ...
- POJ 2135 Farm Tour(最小费用最大流)
Description When FJ's friends visit him on the farm, he likes to show them around. His farm comprise ...
随机推荐
- caption标签,为表格添加标题和摘要
表格还是需要添加一些标签进行优化,可以添加标题和摘要.代码如下: 摘要 摘要的内容是不会在浏览器中显示出来的.它的作用是增加表格的可读性(语义化),使搜索引擎更好的读懂表格内容,还可以使屏幕阅读器更好 ...
- 集成支付宝后出现LaunchServices: ERROR: There is no registered handler for URL scheme alipay
原因如下: There's no problem with your implementation. All those warnings mean is the apps which each UR ...
- makecert 制作数字证书
在MS的SDK6.0中有个证书生成工具makecert.exe, 你可以使用这个工具来生成测试用的证书. 第一步,生成一个自签名的根证书(issuer,签发者). >makecert -n &q ...
- 泛型,迭代器,LinkedList<E>
1 <e>里面只能填类,不能用基本数据类型,不过integer 这样的的也行 2在模板类(泛型类中)class demo<e>由于不知道e是那个,所有通常都是重写大家都有的to ...
- asp.net实现 EXCEL数据导入到数据库功能
在项目中经常要用EXCEL导入数据到数据库,提高工作效率. 注意:EXCEL中的第一行不能导入. 下面是源码: IntoExcel.aspx: [csharp] <%@ Page Languag ...
- shell每日发邮件
LOGFILE="$fank/"`date +"%Y%m%d"`"data"#每日文件 from="abc@123.com&quo ...
- 按钮制作技巧(css精灵效果)-高级版
[转自己以前的文章] 无论用什么语言,大家敲程序的时候多多少少都会遇到做按钮的时候.今天分享一个之前学做按钮的技巧,有人叫做css精灵效果. 通常做按钮的思路都用附图中的第一种:两张图片交互的形式,让 ...
- (转)QT常用快捷键
F1 查看帮助F2 跳转到函数定义(和Ctrl+鼠标左键一样的效果)Shift+F2 声明和定义之间切换F4 头文件和源文件之间切换Ctrl+1 ...
- ActiveX控件资料
Visual Studio 2008(c#)开发ActiveX控件及制作CAB包总结(1) 分类: C#2011-05-27 15:50 403人阅读 评论(0) 收藏 举报 c#stringhook ...
- frame与iframe的区别?
1.frame不能脱离frameSet单独使用,iframe可以 2.frame不能放在body中,否则不能正常显示 3.嵌套在frameSet中的iframe必需放在body中,不嵌套在frameS ...