Dijkstra优先队列优化
来源:互联网 发布:linux 切换管理员权限 编辑:程序博客网 时间:2024/04/25 22:18
Dijkstra算法的核心思想就是两步排序,一个是对于一个点而言,他的最小边要经过所有其他点最小边的测试才能确认,也就是说要在这其中找一个最大的边出来;第二个是对于每次循环而言的,每次的更新d数组都是为了要选出最短的距离。
对于每次出队列的点,都更新他所有的邻边
#include <iostream>#include <cstdio>#include <queue>#include <cstring>#define INF 65535using namespace std; typedef pair<int,int> Node;int n,m;int G[107][107]; bool operator < (Node a,Node b){ return a.first > b.first;} int Dijkstra(){ int v,min; int d[107]; int vis[107]; priority_queue<Node> q; memset(vis,0,sizeof(vis)); for(int i = 1;i <= n;i++) d[i] = INF; d[1] = 0; q.push(make_pair(d[1],1)); while(!q.empty()) { Node t = q.top(); q.pop(); if(vis[t.second]) continue; vis[t.second] = 1; for(int i = 1;i <= n;i++) if(!vis[i] && d[i] > t.first+G[t.second][i]) { d[i] = t.first+G[t.second][i]; q.push(make_pair(d[i],i)); } } return d[n];}int main(){ int x,y,w; while(~scanf("%d%d",&n,&m)) { if(!n && !m) break; for(int i = 1;i <= n;i++) for(int j = 1;j <= n;j++) G[i][j] = i==j?0:INF; for(int i = 1;i <= m;i++) { scanf("%d%d%d",&x,&y,&w); if(w < G[x][y]) G[x][y] = G[y][x] = w; } printf("%d\n",Dijkstra()); } return 0;}
0 0
- 优先队列优化 dijkstra
- Dijkstra(优先队列优化)
- Dijkstra优先队列优化
- 优先队列优化Dijkstra算法
- dijkstra+优先队列优化 模板
- dijkstra的优先队列优化
- 优先队列优化Dijkstra-hdu2066
- Dijkstra算法优先队列优化
- 优先队列优化Dijkstra算法
- PriorityQueue+Dijkstra优先队列优化的Dijkstra
- 优先队列优化的Dijkstra算法
- hdu 2680 dijkstra 使用优先队列优化
- 堆(优先队列)优化dijkstra(邻接矩阵)
- dijkstra算法模板(优先队列优化)
- uva10986 优先队列优化的Dijkstra
- Dijkstra + 优先队列 + 邻接表优化
- HDU5521 Meeting(dijkstra+优先队列优化)
- [codevs1021] 玛丽卡 优先队列优化dijkstra
- oracle connect by用法
- Misha and Changing Handles
- 死锁的检测和解除
- [疯狂Java]基础类库:Object、深拷贝、Objects工具类
- svn 插件报错 Failed to load JavaHL Library解决方法
- Dijkstra优先队列优化
- 探求Floyd算法的动态规划本质(转)
- c语言,读取一个内容长度未知的文本文件。
- HDU-1234(string字符串)
- CF-Mr. Kitayuta's Colorful Graph
- HDU-1978How many ways
- CF- Day at the Beach
- CF-Approximating a Constant Range
- C语言柔性数组