最短路径之 Dijkstra的优化
2014-07-31 09:04
337 查看
Dijkstra算法利用了优先队列,也用到了静态邻接表。主要也是有两部分组成。一: 当然是初始化。将dist和pre分别赋值,然后输入各条边的信息,存储在静态邻接表中 。二: 中Dijkstra中 将Q.push(temp) .然后利用for(i =pre[nod] ; i != -1 ;i = edge[i].next)将每条与temp有关联的边进行遍历。能松弛的点push到Q中。详细看下面的代码。
<span style="font-size:18px;">#include #include #include #include #include using namespace std ; #define MAXN 1000 #define INF 1000000 int map[MAXN][MAXN] ; int visit[MAXN] ; int pre[MAXN] ; int dist[MAXN] ; int path[MAXN] ; int top ; struct node{ int p ; int value ; friend bool operator < (node a , node b ){ return a.value > b.value ; } }; priority_queue Q ; struct Edge { int to ; int w ; int next ; }edge[MAXN*MAXN]; void addedge(int x ,int y , int w ) { edge[top].to = y ; edge[top].w = w ; edge[top].next = pre[x] ; pre[x] = top ; top++ ; } void init (int n, int m) { int i , j ; top = 1 ; memset(pre , -1 ,sizeof(pre)) ; for(i = 1 ;i <= n ; i++) dist[i] = INF ; dist[1] = 0 ; for(i = 1 ;i <= n ; i++){ for(j = 1 ;j <= n ; j++){ map[i][j] = INF ; } } for(i = 1 ;i <= m ; i++){ int x ,y , w ; scanf("%d%d%d" ,&x ,&y , &w) ; if(map[x][y] < w) continue ; addedge(x,y,w) ; addedge(y,x,w) ; map[x][y] = map[y][x] = w ; } } void Dijkstra (int n ) { memset(visit , 0 ,sizeof(visit)) ; node temp ; while(!Q.empty()) Q.pop() ; temp.p = 1 ; temp.value = 0 ; Q.push(temp) ; path[1] = -1 ; while(!Q.empty()) { temp = Q.top() ; Q.pop() ; int nod = temp.p ; int w = temp.value ; if(visit[nod]) continue ; visit[nod] = 1 ; int i ; for(i = pre[nod] ; i != -1 ;i = edge[i].next ){ int t = edge[i].to ; if(visit[t]) continue ; int v = edge[i].w ; if(dist[nod] + v < dist[t]) { dist[t] = dist[nod] + v ; path[t] = nod ; node next ; next.p = t ; next.value = dist[t] ; Q.push(next) ; } } } } int main() { int m , n ; int i , j ; int ans[MAXN] ; while(scanf("%d%d" ,&n, &m )!=EOF ){ if(n == 0 && m == 0) break ; init(n ,m) ; Dijkstra(n) ; printf("%d\n",dist ) ; int t = 0 ; for(i = n ; i != -1 ; i = path[i]){ ans[t++] = i ; } for(i = t-1 ; i >= 0 ; i--){ printf("%d ",ans[i]) ; } printf("\n") ; } return 0; }</span>
相关文章推荐
- 【转】Fibonacci 斐波纳契堆优化 Dijkstra 最短路径算法
- P3371 【模板】单源最短路径 SPFA优化 dijkstra堆优化
- 图论;单源最短路径;拓扑排序+松弛(有向无回路);Bellman-Ford(回路,负权回路);Dijkstra(无负权,可回路);可以用最小堆实现算法的优化;
- 洛谷P3371 单源最短路径(Dijkstra+堆优化)
- 图论;单源最短路径;拓扑排序+松弛(有向无回路);Bellman-Ford(回路,负权回路);Dijkstra(无负权,可回路);可以用最小堆实现算法的优化;
- HDU-3790 最短路径问题(两个权值,Dijkstra,(含堆优化))
- Dijkstra 之最短路径算法(无优化版本) By ACReaper
- 最短路径 Dijkstra+priority_queue优化+bellman_ford+Floyd
- 洛谷 P3371 【模板】单源最短路径(Dijkstra + 堆优化)
- 图论;单源最短路径;拓扑排序+松弛(有向无回路);Bellman-Ford(回路,负权回路)Dijkstra(无负权,可回路);可以用最小堆实现算法的优化;
- Dijkstra 最短路径 优化
- dijkstra最短路径算法和普里姆最小生成树算法优化的关键
- Dijkstra最短路径算法的优化
- C++之路进阶——优先队列优化最短路径算法(dijkstra)
- Node:最短路径之Dijkstra堆优化
- HDU 3790 - 最短路径问题(优化Dijkstra)
- PAT 1030 Travel Plan(单源最短路径+优化Dijkstra)
- //九度教程78 dijkstra算法之单源最短路径
- Matalab代码 实现 Dijkstra求 有向图及无向图之间,任意两点之间的最短路径
- 关于图的常用算法——Dijkstra单源最短路径、Floyd多源最短路径、Prim和Kruskal最小生成树算法