博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
最短路径算法实现
阅读量:6653 次
发布时间:2019-06-25

本文共 2234 字,大约阅读时间需要 7 分钟。

最短路径算法

1、Dijkstra算法

目的是求解固定起点分别到其余各点的最短路径

步骤如下:

  1. 准备工作:构建二位矩阵edge,edge[i][j]存储i->j的权重,如果i==j则edge[i][j]=0,如果i和j不是直达的,则edge[i][j]=MAX_INT
  2. 构建数组dis[],其中dis[i]表示其实点start->i之间的权重,不断更新,得到最小的权重
  3. 选取离start最近的直达点,(注,非直达的点一定会经过中间的跳变点,间接到达,首先考虑的一定是经过离start最近的点进行跳变)
  4. 判断dis[i]与dis[离start最近的点index]+edge[离start最近的点index][i]的大小,更新dis[i]
  5. 重复3-4(注意标记,防止重复计算)
#include 
using namespace std;const int max_int = ~(1<<31);const int min_int = (1<<31);int main(){ int n,m,s;//n is the number of nodes, m is the number of edges and s is the start node. int t1,t2,t3;//t1 is the start node, t2 is the end node and t3 is the weight between t1 and t2 cout<<"Please input the number of node(n), edges(m) and start node(s):"<
>n>>m>>s; int edge[n+1][n+1];//Store the edges for the n nodes int dis[n+1], is_visited[n+1];// dis[k] store the min distance between s and k,\ is_visited store the status of the node(whether it is visited or not) //Init the edge[][] with the max_int for(int i=1; i<=n; i++){ for(int j = 1; j <= n; j++) if(i==j) edge[i][j] = 0; else edge[i][j] = max_int; } //Input the Edge data cout<<"Please input the edge data: t1(start node), t2(end node), t3(weight)"<
>t1>>t2>>t3; edge[t1][t2] = t3; } /* * Init the is_visited[] with 0 * Init the dis[] */ for(int i=1; i<=n; i++){ is_visited[i] = 0; dis[i] = edge[s][i]; } is_visited[s] = 1; //The Dijkstra algorithm for(int i=1; i<=n; i++){ int u; // Store the min value index in dis[] which is not visited int min = max_int; // Store the min value in dis[] which is not visited for(int j=1; j<=n; j++){ if(is_visited[j]==0 && dis[j]
dis[u]+edge[u][k]){ dis[k] = dis[u] + edge[u][k]; cout<
<<" "<
<<" "<
<

 

2、Floyd算法

目的是求解任意两点的最短路径,核心思想是经过任意数量的节点进行中转,检查路径是否为最短

for(k=1;k<=n;k++)//经过k进行中转        for(i=1;i<=n;i++)            for(j=1;j<=n;j++)                if(e[i][j]>e[i][k]+e[k][j])                     e[i][j]=e[i][k]+e[k][j];

转载于:https://www.cnblogs.com/likailiche/p/5977593.html

你可能感兴趣的文章
asterisk常用调试监测命令
查看>>
子用户-角色-权限-菜单 浅谈:子账户设计方案
查看>>
无服务器端的UDP群聊功能剖析(重构版本)
查看>>
Linux进程间通信之信号量(semaphore)、消息队列(Message Queue)和共享内存(Share Memory)...
查看>>
对象失去焦点时自己动提交数据 V2
查看>>
Silverlight/Windows8/WPF/WP7/HTML5周学习导读(10月22日-10月28日)
查看>>
ESX启动故障排除一“Cannot open the disk ‘XXXXXX.vmdk’ or one of the snapshot disks it depends on.”...
查看>>
FileBytes写成文件并存档
查看>>
Metro App中关于挂起与恢复的操作
查看>>
Stani's Python Editor下载
查看>>
[译]Javascript:Harmony(ECMAScript规范)制定流程
查看>>
每天一个linux命令(36):diff 命令
查看>>
2012第50周五
查看>>
一个简单的算法_应该是最笨的写法了
查看>>
20120622第二天_面向对象\02面向对象
查看>>
[翻译].NET框架中的缓存
查看>>
Microsoft Visual Studio 2010 正式版下载[含旗舰版序列号](中、英文版)
查看>>
轻快的VIM(四):修改
查看>>
心惊胆战的多屏图片切换
查看>>
office excel读写类NPOI
查看>>