关于dijkstra
2012-07-12 20:46
106 查看
//v表示起始点,n表示总点数,pre表示上一个点,dis[i]表示当前起始点到i的最短路径,c为所保存的邻接矩阵 void dijkstra(int n,int v,int pre[],int dis[],int c[][]) { bool vis[maxn];//是否用过 for(int i=1;i<=n;i++)//初始化,从起始点开始有路径相连的更新,所有点都未走过,距离更新 { dis[i]=c[v][i]; vis[i]=0; if(dis[i]==maxint) { pre[i]=0 } else pre[i]=v; } vis[v]=1;//起始点已走过 dis[v]=0;//起始点到起始点的距离为0 for(int i=2;i<=n;i++)//除了起始点外的所有点到起始点的最短路 { int u=v; int tmp=maxint; for(int j=1;j<=n;j++)//选择当前点所连的点的最短距离开始走 { if((vis[i]==0)&&(dis[i]<tmp)) { u=j; tmp=dis[i]; } } vis[u]=1; for(int j=1;j<=n;j++)//上述所选点到它的直接相连点的最短距离 { if(vis[i]==0&&c[u][j]<tmp) { int newdis=dis[u]+c[u][j]; if(newdis<dis[j]) { dis[j]=newdis; pre[j]=u; } } } } } void search(int *pre,int v,int u)//从第v个点到u点的最短路径,因为pre已经在dijkstra中更新,所以只用输出就好了 { int que[maxn]; int tot=1; que[tot]=u; tot++; int tmp=pre[u]; while(tmp!=v) { que[tot]=tmp; tot++; tmp=pre[tmp]; } for(int i=tot;i>=1;i++) { if(i!=1) cout<<que[i]<<"->"; else cout<<que[i]<<endl; } }
相关文章推荐
- 关于dijkstra+heap的实现
- 关于dijkstra的小根堆优化
- 关于Dijkstra 和 Bellman-ford算法的简单理解
- 关于图的常用算法——Dijkstra单源最短路径、Floyd多源最短路径、Prim和Kruskal最小生成树算法
- 关于Dijkstra最短路径算法
- 关于最短路径中的Dijkstra和Bell-man算法的区别
- 你不知道的关于计算机大师Dijkstra的事情
- 关于dijkstra
- 关于用Dijkstra求最短路径的学习小结(附上源码)
- 你不知道的关于计算机大师 Dijkstra 的事情
- 关于最短路径中的Dijkstra和Bell-man算法的区别
- 你不知道的关于计算机大师Dijkstra的事情
- 关于利用Dijkstra和DFS进行多条件选择路径问题范例
- 关于狄克斯特拉算法(dijkstra)总结
- 关于dijkstra的贪心思想的正确性的证明
- 关于dijkstra+heap的实现
- 关于dijkstra的一点总结
- 关于水晶报表打包的一些注意的地方!
- 关于工作流的模式
- 关于java异常中的throws和throw的区别