ACM/ICPC 之 最短路径-Bellman Ford范例(POJ1556-POJ2240)
两道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)的更多相关文章
- ACM/ICPC 之 最短路径-dijkstra范例(ZOJ2750-POJ1135(ZOJ1298))
最短路经典算法-dijkstra范例(两道),第一道是裸的dijkstra,第二道需要枚举所有边已找到可能的情况. ZOJ2750-Idiomatic Phrases Game 题意:见Code 题解 ...
- ACM/ICPC 之 网络流入门-Ford Fulkerson与SAP算法(POJ1149-POJ1273)
第一题:按顾客访问猪圈的顺序依次构图(顾客为结点),汇点->第一个顾客->第二个顾客->...->汇点 //第一道网络流 //Ford-Fulkerson //Time:47M ...
- ACM/ICPC 之 SPFA范例两道(POJ3268-POJ3259)
两道以SPFA算法求解的最短路问题,比较水,第二题需要掌握如何判断负权值回路. POJ3268-Silver Cow Party //计算正逆最短路径之和的最大值 //Time:32Ms Memory ...
- Bellman - Ford 算法解决最短路径问题
Bellman - Ford 算法: 一:基本算法 对于单源最短路径问题,上一篇文章中介绍了 Dijkstra 算法,但是由于 Dijkstra 算法局限于解决非负权的最短路径问题,对于带负权的图就力 ...
- Bellman—Ford算法思想
---恢复内容开始--- Bellman—Ford算法能在更普遍的情况下(存在负权边)解决单源点最短路径问题.对于给定的带权(有向或无向)图G=(V,E),其源点为s,加权函数w是边集E的映射.对图G ...
- 2014嘉杰信息杯ACM/ICPC湖南程序设计邀请赛暨第六届湘潭市程序设计竞赛
比赛链接: http://202.197.224.59/OnlineJudge2/index.php/Contest/problems/contest_id/36 题目来源: 2014嘉杰信息杯ACM ...
- ACM/ICPC 之 BFS(离线)+康拓展开(TSH OJ-玩具(Toy))
祝大家新年快乐,相信在新的一年里一定有我们自己的梦! 这是一个简化的魔板问题,只需输出步骤即可. 玩具(Toy) 描述 ZC神最擅长逻辑推理,一日,他给大家讲述起自己儿时的数字玩具. 该玩具酷似魔方, ...
- 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 ...
- 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 ...
随机推荐
- JS的splice()方法和slice()方法
在w3c school中描述如下: 定义和用法splice() 方法用于插入.删除或替换数组的元素.语法arrayObject.splice(index,howmany,element1,....., ...
- 详解FindBugs的各项检测器 .
FindBugs是一个静态分析工具,在程序不需运行的情况下,分析class文件,将字节码与一组缺陷模式进行对比,试图寻找真正的缺陷或者潜在的性能问题.本文档主要详细说明FindBugs 2.0.3版本 ...
- 【CISP笔记】操作系统安全
账号安全设置 默认管理账号Administrator更名,设置密码(字母.数字.大小写字母.特殊字符,长度在8位以上). 本地安全策略 打开方式 win+R 输入ecpol.msc 账号锁定策略 用户 ...
- EF-联合查询-结果集-Group by-统计数目
EF框架用着痛并且快乐着··· 毕竟用习惯了SQL语句直接硬查的··· SELECT C0.ID,C_C.Name,C_C.C_COUNT FROM article_type C0 INNER JOI ...
- WCF--提示:异常消息为“传入消息的消息格式不应为“Raw”。此操作的消息格式应为 'Xml', 'Json'。
Ajax调用WCF服务... 本来用 // $.getJSON("http://localhost:16625/Service1.svc/Article_GetInfo", { } ...
- 清北学堂模拟day6 兔子
[问题描述] 在一片草原上有N个兔子窝,每个窝里住着一只兔子,有M条路径连接这些窝.更特殊地是,至多只有一个兔子窝有3条或更多的路径与它相连,其它的兔子窝只有1条或2条路径与其相连.换句话讲,这些兔子 ...
- 被拒原因——You have selected the Kids Category for your app, but it does not include the required privacy policy. Please update your app metadata to include a privacy policy URL and ensure that the URL yo
对于一些孩子类的应用,必须加上隐私政策网址(URL),直接截个图吧! 就是你上架的时候,填写应用信息,里面有一个隐私政策网址(URL),望后者不掉坑里了!!!
- jQuery.extend()介绍
},{name:"Jerry",sex:"Boy"}) 得到的Result结果是: result={name:"Jerry",age:21, ...
- [codevs1022]覆盖
[codevs1022]覆盖 试题描述 有一个N×M的单位方格中,其中有些方格是水塘,其他方格是陆地.如果要用1×2的矩阵区覆盖(覆盖过程不容许有任何部分重叠)这个陆地,那么最多可以覆盖多少陆地面积. ...
- jquery版悬浮模块demo
在做在线客服时,代码就是按照该模块命名.现在,我要添加一个返回主页的功能,我觉得再复制一遍之前的代码,那个量有点多,如果我再添加一个功能,那个量会很多……现在我用创建对象字面量的方式来创建(其实我还想 ...