poj2253 用dijkstra计算最短路径的两个结点的最短长度
来源:互联网 发布:阿里云计算技术架构 编辑:程序博客网 时间:2024/05/22 06:19
题意:就是一个青蛙A要到另一个青蛙B所在的石头上,因为水太脏不能游泳,所以A得通过连续的跳跃跳到B所在的石头上,题目给定每个石头的坐标,通过两点间公式计算出两点坐标,要求我们求出最短路径中青蛙跳的长度最小的的那次跳跃的长度。
思路:一开始直接是打算dijksta的,用一个re来更新每加入一个新结点的时候记录最小长度,但是想错来,dist数组保存的是i到源点的最短距离,并不是这条最短路径上的两个节点的最短距离。所以得更新下dist的定义。现在定义dist为最短路径上最小的一次跳跃。那么在松弛的时候就要做出改变。因为要添加一条边,所以就得判断dist[j] dist[u] map[u][j]这三个数谁最小。最小的更新到dist[j]上。用图来表示一下。
已知已经走到来2这一点,那么在更新dist[3]的时候,就要判断是否要添加2-3这条边了,那么有三个数要比较,dist[3],记录着从1-3的最短路径中两个结点间的最短长度,dist[2]记录从1-2的最短长度。2-3这条map[ 2][3]这条新加的边。如果dist[3]不是最短就更新dist[3]。
思路:一开始直接是打算dijksta的,用一个re来更新每加入一个新结点的时候记录最小长度,但是想错来,dist数组保存的是i到源点的最短距离,并不是这条最短路径上的两个节点的最短距离。所以得更新下dist的定义。现在定义dist为最短路径上最小的一次跳跃。那么在松弛的时候就要做出改变。因为要添加一条边,所以就得判断dist[j] dist[u] map[u][j]这三个数谁最小。最小的更新到dist[j]上。用图来表示一下。
已知已经走到来2这一点,那么在更新dist[3]的时候,就要判断是否要添加2-3这条边了,那么有三个数要比较,dist[3],记录着从1-3的最短路径中两个结点间的最短长度,dist[2]记录从1-2的最短长度。2-3这条map[ 2][3]这条新加的边。如果dist[3]不是最短就更新dist[3]。
贴上代码:
#include<iostream>#include<stdio.h>#include<math.h>#include<string.h>#include<stdlib.h>using namespace std;#define maxn 205#define inf 999999.9double ma[maxn][maxn];double dist[maxn];int vis[maxn];double xy[maxn][2];int n;double far(double x1,double y1,double x2,double y2){ double f=(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2); //printf("%.3lf\n",sqrt(f)); return sqrt(f);}double dijkstra(int u){ for(int i=1; i<=n; i++) { dist[i]=ma[u][i]; //printf("%.3lf\n",dist[i]); vis[i]=0; } // printf("\n"); vis[u]=1; dist[u]=0; double mi; for(int i=1; i<=n-1; i++) { mi=inf; int tm=0; for(int j=1; j<=n; j++) { if(!vis[j]&&dist[j]<mi) { mi=dist[j]; tm=j; } } vis[tm]=1; if(tm==0) break; for(int j=1; j<=n; j++) { if(!vis[j]) { double maxx=max(dist[tm],ma[tm][j]); //dist记录的不是最短路径而是最短路径中的两个结点间的最短长度 if(dist[j]>maxx) dist[j]=maxx; } } } return dist[2];}int main(){ int ca=1; while(scanf("%d",&n)!=EOF) { if(n==0) return 0; memset(ma,inf,sizeof(ma)); memset(dist,inf,sizeof(dist)); memset(vis,0,sizeof(vis)); for(int i=1; i<=n; i++) { scanf("%lf %lf",&xy[i][0],&xy[i][1]); } for(int i=1; i<=n; i++) { for(int j=1; j<i; j++) { if(i!=j) { ma[i][j]=ma[j][i]=far(xy[i][0],xy[i][1],xy[j][0],xy[j][1]); } } ma[i][i]=0; } double ans=dijkstra(1); printf("Scenario #%d\n",ca); ca++; printf("Frog Distance = %.3f\n\n",ans); }}
0 0
- poj2253 用dijkstra计算最短路径的两个结点的最短长度
- Python-通过Dijkstra计算两点之间的最短路径
- BGL使用dijkstra计算图的最短路径
- POJ2253 Frogger(最短路径)
- POJ2253 最短路径变形
- 最短路径(3)--poj2253(Dijkstra变形题)
- 计算结点1到结点n的最短路径,以及最短路径的条数
- Dijkstra算法的最短路径实现
- 图的最短路径dijkstra算法
- Dijkstra 算法求非负权图的最短路径
- 最短路径之 Dijkstra的优化
- dijkstra最短路径算法的实现
- 最短路径的Dijkstra算法
- Dijkstra最短路径算法的优化
- Dijkstra算法--图的最短路径
- 求赋权图中一个结点到所有结点的最短路径的长度
- 求赋权图中一个结点到所有结点的最短路径的长度
- 最短路径 Dijkstra
- Android M 部分API变动研究
- 按格式输出 用到 js中的nextUntil
- JSON 隐藏的特殊用法
- java操作pdf文件
- Xcode 添加 SVN 出现 nsurlerrordomain error 1012
- poj2253 用dijkstra计算最短路径的两个结点的最短长度
- Exception in thread "main" java.lang.NullPointerException at java.lang.ProcessBuilder.start(
- 深入理解C++标准类型转换符:static_cast、dynamic_cast、reinterpret_cast和const_cast
- Android开源项目WheelView使用示例
- 修改VC6项目名称
- Java教程:了解Java类的组成
- 使用springmvc+mybatis时遇到的问题总结
- A+B Problem
- DBMS_STATS.GATHER_SCHEMA_STATS介绍使用