单源最短路径 Dijkstra算法
第一看完Dijkstra算法感觉就四个字————步步贪心
想学Dijkstra算法得了解动态规划的思想
怎么解释呢???
举个例子
有一张图n个顶点m条边 每条边上都有权值叫你求顶点1到其他顶点的最短路径
step 1 找出离顶点1最近的点(这好找吧)使用一个数组将每个点到顶点1 的最短路径记录下来(dis数组)
还有已经找到离顶点1最短路径的要记录下来可以使用一个book数组记录(防止重复记录)
将dis数组中的值于e[][]+dis[][比较 如果后者较小 则更新dis数组
step 2 重复step1 直到book数组中全部记录完全
还是贴代码吧 累
#include<iostream> #define inf 0x333f using namespace std; int main() { int dis[10],book[10],e[10][10],n,m,a,b,v,min,flag;//n表示顶点,m表示边 cin>>n>>m; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(i==j) e[i][j]=0; else e[i][j]=inf; } } for(int i=1;i<=m;i++) { cin>>a>>b>>v; e[a][b]=v; } for(int i=1;i<=n;i++) { dis[i]=e[1][i]; } for(int i=1;i<=n;i++) { book[i]=0; } book[1]=1; //找到离单源最短的顶点 min=inf; for(int i=1;i<n;i++) { min=inf; for(int j=1;j<=n;j++) { if(book[j]==0&&dis[j]<min) { min=dis[j]; flag=j; } } book[flag]=1; for(int k=1;k<=n;k++) { if(e[flag][k]<inf) { if(dis[k]>dis[flag]+e[flag][k]) dis[k]=dis[flag]+e[flag][k]; } } } for(int i=1;i<=n;i++) cout<<dis[i]<<" "; return 0; }
2020/2/13更新
写的还不错,现在看思路还算清晰,给过去的自己一个好评。
如果你够坚强够勇敢,你就能驾驭他们