两道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. Method Swizzling (方法调配)

    Method Swizzling是改变一个selector的实际实现的技术.通过这一技术,我们可以在运行时通过修改类的分发表中selector对应的函数,来修改方法的实现. 例如,我们想跟踪在程序中每 ...

  2. 点击每个li输出里面的内容(前端很常问的面试题之一)

    点击每个li输出里面的内容(前端很常问的面试题之一) 前端 面试 JavaScript <!DOCTYPE html> <html lang="en"> & ...

  3. SqlServer 还原他服数据库只建立发布却删除不了

    本想做测试,从另一台服务器备份数据库还原到本机. 创建了一个发布,却删除不了,提示如下图: 参考论坛:http://bbs.csdn.net/topics/300046417 发现是数据库所有者问题, ...

  4. web开发前端学习

    bootstrap:  http://www.bootcss.com/ bootstrap:   http://bootsnipp.com/snippets/featured/single-colum ...

  5. POJ 1850 Code

    组合数学.... Code Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 7202 Accepted: 3361 Descrip ...

  6. VC++ 6.0使用定时器SetTimer;

    背景: windows中使用VC++6.0制作了个交互界面向下位机定时发送数据及显示下位机上传的数据.定时发送则需要使用定时器. 本文只做记录如何调用,原理以后再深究. 正文: 首先,我生成的窗体类名 ...

  7. Hadoop 之Impala

    impala 是基于hive的大数据实时分析查询引擎,直接使用Hive的元数据库metadata意味着impala元数据都存储在hive的metadstore中并且impala兼容hive的 sql解 ...

  8. LR学习笔记---参数设置 (转 温故而知新)

    LR在录制程序运行的过程中,VuGen(脚本生成器) 自动生成了包含录制过程中实际用到的数值的脚本,如果你企图在录制的脚本中使用不同的数值执行脚本的活动(如查询.提交等等),那么你必须用参数值取代录制 ...

  9. STAR-H1208M集线器不支持同时挂载多个nfs

    今天在两个触摸屏上都加入了开机加载nfs的操作. 没想到会出现以下错误: pmap_getmaps.c: rpc problem: RPC: Unable to receive; errno = Co ...

  10. FineUI第十六天---表格的排序和分页

    表格的排序和分页 1.表格的排序需要: AllowSorting:是否允许排序. SortColumn:当前排序的列ID,当然也可以不设置此属性,而是在后台初始化代码中直接指定默认排序字段. Sort ...