1. 问题
l 用Floyd算法求解下图各个顶点的最短距离。写出Floyd算法的伪代码和给出距离矩阵(顶点之间的最短距离矩阵),
l 对于下图使用Dijkstra算法求由顶点a到顶点h的最短路径。
2. 解析
Floyd算法:暴力法,dis[i][j]表示i节点到j节点的最短距离,每次遍历1-n个点判断dis[i][k]+dis[k][j]和dis[i][j]的大小。
Dijkstra算法:贪心法,首先把起点到所有点的距离存下来找个最短的,然后松弛一次再找出最短的,所谓的松弛操作就是,遍历一遍看通过刚刚找到的距离最短的点作为中转站会不会更近,如果更近了就更新距离,这样把所有的点找遍之后就存下了起点到其他所有点的最短距离。
3.设计
1 void floyd(){ 2 for(int k=1;k<=n;k++){ 3 for(int i=1;i<=n;i++){ 4 for(int j=1;j<=n;j++){ 5 dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]); 6 } 7 } 8 } 9 } 10 11 void dijkstra(int a){ 12 memset(vis,0,sizeof vis); 13 rep(i,1,n){ 14 dis[i]=g[a][i]; 15 } 16 vis[a]=1; 17 rep(i,1,n-1){ 18 int minn=inf,k; 19 rep(j,1,n){ 20 if(!vis[j]&&minn>dis[j]){ 21 minn=dis[j]; 22 k=j; 23 } 24 } 25 vis[k]=1; 26 rep(j,1,n){ 27 if(g[k][j]+dis[k]<dis[j]){ 28 dis[j]=g[k][j]+dis[k]; 29 } 30 } 31 } 32 }
4.分析
Floyd时间复杂度:三重循环O(n^3);
Dijkstra时间复杂度:双层循环内层每次遍历N点中到目标点的最近距离所以复杂度是O(n^2)
5.源码:https://github.com/xiaojunjun601/sfHomework1/tree/master/%E4%BB%A3%E7%A0%81