两道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. java 的 AccessController.doPrivileged使用

    AccessController.doPrivileged意思是这个是特别的,不用做权限检查. 在什么地方会用到呢:加入1.jar中有类可以读取一个文件,现在我们要使用1.jar去做这个事情.但是我们 ...

  2. 【转】随机函数 rand() srand() 以及seed的原理

    from:http://blog.csdn.net/feige2008/article/details/6943885   标准库<cstdlib>(被包含于<iostream> ...

  3. acpi和btrfs-安装opensuse时的选项

    g-------------------- 关于GPL和LGPL和QPL等 读书笔记:采用LGPL的代码,一般情况下它本身就是一个第三方库(别忘了LGPL最早的名字就是Library GPL),这时候 ...

  4. google-breakpad

    BUG收集系统: 国内可以使用友盟,国外可以使用Crashlytics SDK,或者自己实现使用 google-breakpad,参见下列文章: Crashlytics SDK 部分: http:// ...

  5. button事件驱动

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  6. Ubuntu 14 编译安装 XDebug - 2.3.3 For PHP - 5.4.45

    安装过程如下: 1.下载XDebug源码:http://xdebug.org/files/xdebug-2.3.3.tgz 2.解压到某个目录,如 /opt/software/xdebug-2.3.3 ...

  7. WordPress文章浏览历史插件

    选自:http://www.ludou.org/wordpress-recently-viewed.html 最近有很多网友问我,露兜博客右边栏底部的 您刚刚看过 栏目是怎么实现.其实我也是参考的这篇 ...

  8. Eclipse的link方式安装JBPM6插件(JBPM学习之一)

    1. 首先下载最新的JAVA开发最受欢迎的Eclipse IDE工具,下载地址:http://www.eclipse.org/downloads/ 2. 然后去JBPM社区去下载最新的JBPM6,下载 ...

  9. Effective Java 读书笔记之三 类和接口

    一.使类和成员的可访问性最小化 1.尽可能地使每个类或者成员不被外界访问. 2.实例域决不能是共有的.包含公有可变域的类不是线程安全的. 3.除了公有静态final域的特殊情形之外,公有类都不应该包含 ...

  10. VVDocumenter升级后不能使用问题

    VVDocumenter-Xcode是Xcode上一款快速添加标准注释,并可以自动生成文档的插件.有了VVDocumenter-Xcode,规范化的注释,只需要输入三个斜线“///”就可以搞定,非常方 ...