ACM/ICPC 之 最短路径-Bellman Ford范例(POJ1556-POJ2240)

时间:2020-12-03 23:06:12

  两道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&sol;ICPC 之 最短路径-dijkstra范例&lpar;ZOJ2750-POJ1135&lpar;ZOJ1298&rpar;&rpar;

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

  2. ACM&sol;ICPC 之 网络流入门-Ford Fulkerson与SAP算法&lpar;POJ1149-POJ1273&rpar;

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

  3. ACM&sol;ICPC 之 SPFA范例两道&lpar;POJ3268-POJ3259&rpar;

    两道以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&sol;ICPC湖南程序设计邀请赛暨第六届湘潭市程序设计竞赛

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

  7. ACM&sol;ICPC 之 BFS&lpar;离线&rpar;&plus;康拓展开&lpar;TSH OJ-玩具&lpar;Toy&rpar;&rpar;

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

  8. ACM ICPC 2015 Moscow Subregional Russia&comma; Moscow&comma; Dolgoprudny&comma; October&comma; 18&comma; 2015 G&period; 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&comma; Moscow&comma; Dolgoprudny&comma; October&comma; 18&comma; 2015 D&period; Delay Time

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

随机推荐

  1. 两张table数据同步--使用触发器

    数据同步, 如果每天同步一次的话可以使用SSIS,跑JOB等,可以同步不同的DB的数据: 实时的可以使用触发器,在同一个DB中(或者DB Link): USE [test] GO IF EXISTS( ...

  2. 进程环境之getrlimit和setrlimit函数

    每个进程都有一组资源限制,其中一些可以用getrlimit和setrlimit函数查询和更改. #include <sys/resource.h> int getrlimit( int r ...

  3. String与常量池

    转自:http://blog.sina.com.cn/s/blog_69dcd5ed0101171h.html 1. 首先String不属于8种基本数据类型,String是一个对象.因为对象的默认值是 ...

  4. 通过jqueryui实现邮件提示

    //js代码$(function () { var availableTags = ["@qq.com", "@gmail.com", "@126.c ...

  5. SDL 2&period;0 如何在 windows 上使用?

    https://wiki.libsdl.org/APIByCategory http://adolfans.github.io/sdltutorialcn/sdl-2-dot-0-tutorial-i ...

  6. TensorFlow Serving-TensorFlow 服务

    TensorFlow服务是一个用于服务机器学习模型的开源软件库.它处理机器学习的推断方面,在培训和管理他们的生命周期后采取模型,通过高性能,引用计数的查找表为客户端提供版本化访问. 可以同时提供多个模 ...

  7. 15&period;翻译系列:EF 6中的级联删除【EF 6 Code-First 系列】

    原文链接:https://www.entityframeworktutorial.net/code-first/cascade-delete-in-code-first.aspx EF 6 Code- ...

  8. 使用&lowbar;&lowbar;slots&lowbar;&lowbar;节省python内存技巧

    __slots__作用 __slots__有一个作用是:限制类实例绑定的属性,但是它有一个更重要的作用就是节省内存,当然更适用于数据量大的情况(万量级以上). __slots__节省内存的原理 cla ...

  9. SQL中的每一张表都必须设有主键吗

    问题描述: 公司的数据库表有时候会看到没有主键的,SQL中的每一张表都必须设有主键吗? 主键的作用: 1)保证实体的完整性: 2)加快数据库的操作速度: 3)在表中添加新记录时,数据库ACCESS会自 ...

  10. 远程桌面访问linux

    hostname -I 10.13.34.185 4900 light-wings http://blog.csdn.net/qq754438390/article/details/50042511