首页 > 代码库 > 优先队列来处理的 最短路径
优先队列来处理的 最短路径
看了好久终于看懂了 ,首先你要知道 优先队列在这里的作用是什么。在Djsktra的算法中 我们需要有三个for其中有个for是要找到 连接中最小的点 并且返回该点 ,这里的优先队列把这个for循环替掉。typedef pair pii;priority_queue< pii , vector , greater > q; 这个优先队列是根据 pair 中的first来 从小到大排的。这里的pair中的first的值就是dist 所以q.top时 返回了这个最小的点V #include#include#include#includeusing namespace std;#define MAX 100const int INF = (1<<30) - 1;typedef pair pii;priority_queue< pii , vector , greater > q; //优先队列int edges[MAX][MAX]; //邻接表int n , m;int d[MAX]; //路径长度void init(){ for(int i = 0; i < n; ++i) { for(int j = 0; j < n; ++j) { if(i == j) edges[i][j] = 0; else edges[i][j] = INF; } }}void dijkstra(int v){ bool done[MAX]; for(int i = 0; i < n; ++i) { d[i] = (edges[v][i] == 0 ? 0 : INF); } memset(done,0,sizeof(done)); q.push(make_pair(d[v],v)); \\ v:起点 while(!q.empty()) { pii u = q.top(); q.pop(); int x = u.second; if(done[x]) continue; done[x] = true; for(int j = 0; j < n; ++j) { if(!done[j] && edges[x][j] < INF && d[x] + edges[x][j] < d[j]) { d[j] = d[x] + edges[x][j]; q.push( make_pair(d[j],j) ); } } } for(int i = 0; i < n; ++i) { cout << d[i] << endl; }}int main(){ int vi = 0; int u , v , w; cin >> n >> m; init(); for(int i = 0; i < m; ++i) //无向图的输入 { cin >> u >> v >> w; edges[u][v] = edges[v][u] = w; } dijkstra(vi); return 0;}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。