两道Bellman Ford解最短路的范例,Bellman Ford只是一种最短路的方法,两道都可以用dijkstra, SPFA做。

  Bellman Ford解法是将每条边遍历一次,遍历一次所有边可以求得一点到任意一点经过一条边的最短路,遍历两次可以求得一点到任意一点经过两条边的最短路...如 此反复,当遍历m次所有边后,则可以求得一点到任意一点经过m条边后的最短路(有点类似离散数学中邻接矩阵的连通性判定)


POJ1556-The Doors

  初学就先看POJ2240吧

  题意:求从(0,5)到(10,5)的最短折线距离,中间会给最多十八道墙。

  题解:本题设计简单的计算几何知识和最短路的知识,读完题后要将墙的端点看做一个坐标,先求出所有的可行边,然后做一次最短路就可以了

 //门
//POJ1556-ZOJ1721
//简单几何+最短路
//Time:0Ms Memory:204K
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
#define INF 0x7f7f7f7f
#define MAX 20*5
#define POW2(x) ((x)*(x))
#define DIS(i,j) sqrt(POW2(i.x - j.x) + POW2(i.y - j.y))
#define P(i,j) (4*i+j) //第i组第j个点的序列号
struct Point {
double x, y;
}p[MAX];
struct Edge {
int u, v;
double d;
}e[MAX*MAX];
int n, m;
double d[MAX];
int en; //edge_num
//判断两点是否能在maxn组点内连通
bool access(Point p1, Point p2, int maxn)
{
for (int i = ; i < maxn; i++)
if (p[P(i, )].x > p1.x && p[P(i, )].x < p2.x) //该组点在两点之间
{
//算出线段在该横坐标下的纵坐标
double y = (p1.y - p2.y) / (p2.x - p1.x) * (p2.x - p[P(i, )].x) + p2.y;
if (y > p[P(i, )].y || y < p[P(i, )].y || (y > p[P(i, )].y && y < p[P(i, )].y)) //相交
return false;
}
return true;
}
//记录x组第y个点作为终点的线段
void add(int x, int y)
{
for (int k = ; k <= * x; k++)
if (access(p[k], p[P(x, y)], x)) {
e[en].u = k;
e[en].v = P(x, y);
e[en++].d = DIS(p[e[en].u], p[e[en].v]);
}
}
void bellman_ford(int x)
{
memset(d, INF, sizeof(d));
d[] = ;
for (int i = ; i <= n; i++) //扩展n+1次
for (int j = ; j < en; j++) //遍历每条边
d[e[j].v] = min(d[e[j].u] + e[j].d, d[e[j].v]);
}
int main()
{
//起点
p[].x = ;
p[].y = ;
while (scanf("%d", &n), n != -)
{
en = ; //Init
double x, y;
for (int i = ; i < n; i++)
{
scanf("%lf", &x);
for (int j = ; j <= ; j++)
{
scanf("%lf", &y);
p[P(i,j)].x = x;
p[P(i,j)].y = y;
add(i, j);
}
}
//终点
p[P(n, )].x = ;
p[P(n, )].y = ;
add(n, ); bellman_ford();
printf("%.2f\n", d[P(n, )]);
} return ;
}

POJ2240-Arbitrage

  题意:从一种货币A经过多次转换后可以得到更多的货币A,则称为套汇,求给定货币转换语句,判断是否存在套汇。

  题解:将货币看做结点,转换比率看做路长(乘积关系),建立一个图模型就可以知道实际上是在求是否存在最长路的路长超过1。

 //套汇
//POJ2240-ZOJ1092
//求最长路(乘积) - 回路 路长 > 1 则为套汇
//Time:63Ms Memory:200K
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
#define MAX 32
#define MAXS 20
struct Edge {
int u, v;
double d;
}e[MAX*MAX];
int n, m;
char city[MAX][MAXS];
double d[MAX]; //到某一点的最长路
int find(char s[MAXS])
{
for (int i = ; i < n;i++)
if (!strcmp(s, city[i])) return i;
return -;
}
//是否套汇
bool bellman_ford(int x)
{
memset(d, , sizeof(d));
d[x] = ;
for (int i = ; i <= n; i++) //最多经过n条边回到x(若更多次变更也只能是套汇)
for (int j = ; j < m; j++)
{
d[e[j].v] = max(d[e[j].u] * e[j].d, d[e[j].v]);
if (d[x] > ) return true;
}
return false;
}
int main()
{
int cas = ;
while (scanf("%d", &n), n)
{
for (int i = ; i < n; i++)
scanf("%s", city[i]);
scanf("%d", &m);
for (int i = ; i < m; i++)
{
char s1[MAXS], s2[MAXS];
double dis;
scanf("%s%lf%s", s1, &dis, s2);
e[i].u = find(s1);
e[i].v = find(s2);
e[i].d = dis;
} bool flag = false;
for (int i = ; i < n; i++)
{
if (bellman_ford(i)) {
flag = true;
break;
}
}
if (flag == true)
printf("Case %d: Yes\n", cas++);
else printf("Case %d: No\n", cas++);
}
return ;
}

ACM/ICPC 之 最短路径-Bellman Ford范例(POJ1556-POJ2240)的更多相关文章

  1. ACM/ICPC 之 最短路径-dijkstra范例(ZOJ2750-POJ1135(ZOJ1298))

    最短路经典算法-dijkstra范例(两道),第一道是裸的dijkstra,第二道需要枚举所有边已找到可能的情况. ZOJ2750-Idiomatic Phrases Game 题意:见Code 题解 ...

  2. ACM/ICPC 之 网络流入门-Ford Fulkerson与SAP算法(POJ1149-POJ1273)

    第一题:按顾客访问猪圈的顺序依次构图(顾客为结点),汇点->第一个顾客->第二个顾客->...->汇点 //第一道网络流 //Ford-Fulkerson //Time:47M ...

  3. ACM/ICPC 之 SPFA范例两道(POJ3268-POJ3259)

    两道以SPFA算法求解的最短路问题,比较水,第二题需要掌握如何判断负权值回路. POJ3268-Silver Cow Party //计算正逆最短路径之和的最大值 //Time:32Ms Memory ...

  4. Bellman - Ford 算法解决最短路径问题

    Bellman - Ford 算法: 一:基本算法 对于单源最短路径问题,上一篇文章中介绍了 Dijkstra 算法,但是由于 Dijkstra 算法局限于解决非负权的最短路径问题,对于带负权的图就力 ...

  5. Bellman—Ford算法思想

    ---恢复内容开始--- Bellman—Ford算法能在更普遍的情况下(存在负权边)解决单源点最短路径问题.对于给定的带权(有向或无向)图G=(V,E),其源点为s,加权函数w是边集E的映射.对图G ...

  6. 2014嘉杰信息杯ACM/ICPC湖南程序设计邀请赛暨第六届湘潭市程序设计竞赛

    比赛链接: http://202.197.224.59/OnlineJudge2/index.php/Contest/problems/contest_id/36 题目来源: 2014嘉杰信息杯ACM ...

  7. ACM/ICPC 之 BFS(离线)+康拓展开(TSH OJ-玩具(Toy))

    祝大家新年快乐,相信在新的一年里一定有我们自己的梦! 这是一个简化的魔板问题,只需输出步骤即可. 玩具(Toy) 描述 ZC神最擅长逻辑推理,一日,他给大家讲述起自己儿时的数字玩具. 该玩具酷似魔方, ...

  8. ACM ICPC 2015 Moscow Subregional Russia, Moscow, Dolgoprudny, October, 18, 2015 G. Garden Gathering

    Problem G. Garden Gathering Input file: standard input Output file: standard output Time limit: 3 se ...

  9. ACM ICPC 2015 Moscow Subregional Russia, Moscow, Dolgoprudny, October, 18, 2015 D. Delay Time

    Problem D. Delay Time Input file: standard input Output file: standard output Time limit: 1 second M ...

随机推荐

  1. Ubuntu终端常用的快捷键

    Ubuntu终端常用的快捷键 Ubuntu中的许多操作在终端(Terminal)中十分的快捷,记住一些快捷键的操作更得心应手.在Ubuntu中打开终端的快捷键是Ctrl+Alt+T.其他的一些常用的快 ...

  2. xStream完美转换XML、JSON

    xStream框架 xStream可以轻易的将Java对象和xml文档相互转换,而且可以修改某个特定的属性和节点名称,而且也支持json的转换: 前面有介绍过json-lib这个框架,在线博文:htt ...

  3. 7个Linux和Ubuntu下的免费CSS编辑器

    一个好的编辑器是世界上所有程序员和web开发人员梦寐以求的东西.代码编辑器和集成开发环境是程序员工作时的左膀右臂.还在纠结使用什么编辑器么?下面我们将推荐7个主要用于Linux操作系统的免费CSS代码 ...

  4. 第二章平稳时间序列模型——ACF和PACF和样本ACF/PACF

    自相关函数/自相关曲线ACF   AR(1)模型的ACF: 模型为: 当其满足平稳的必要条件|a1|<1时(所以说,自相关系数是在平稳条件下求得的):          y(t)和y(t-s)的 ...

  5. 【Solr】索引库查询界面详解

    目录 索引库查询界面详解 回到顶部 索引库查询界面详解 q:主查询条件.完全支持lucene语法.还进行了扩展. fq:过滤查询.是在主查询条件查询结果的基础上进行过滤.例如:product_pric ...

  6. iOS之下拉放大,上推缩小,一个方法搞定

    先来看看效果吧. 讲讲大概的实现思路:1、创建头部的视图和tableview,需要注意的是tableview要设置contentInset,contentInsent 的顶部要和头部视图的背景图的高度 ...

  7. 关于QString::toWCharArray 无法解析的外部符号

    1>CommManger.obj : error LNK2019: 无法解析的外部符号 "public: int __thiscall QString::toWCharArray(un ...

  8. HTML5 之Canvas 绘制时钟 Demo

    <!DOCTYPE html> <html> <head> <title>Canvas 之 时钟 Demo</title> <!--简 ...

  9. List对象排序通用方法

    import java.util.Collections; import java.util.Comparator; import java.util.List; import java.lang.r ...

  10. hibernate 的三种状态 如何转化的。

    1. 临时状态  由 new命令开辟内存空间的java对象,例如: User user=new User(); 临 时对象在内存孤立存在,它是携带信息的载体,不和数据库的数据有任何关联关系.   2. ...