最短路 (含队列优化的dijstra)- - 模板

xiaoxiao2021-02-28  109

void dji(int v0){ //v0:初始点 int pos = v0; for(int i=1;i<=n;i++){ dist[i] = map[v0][i]; //dist[]数组存储各点到初始点的距离 } vis[pos] = 1; //vis[]数组标记是否已经找到到一个点最短路 for(int i=1;i<n;i++){ //控制查找n-1次 int min = INF; //初始min为一个极大的数INF for(int j=1;j<=n;j++){ //查找到初始点的最短路 if(vis[j]==0 && dist[j]<min){ pos = j; min = dist[pos]; } } vis[pos] = 1; //pos这个点已经找到最短路,标记 for(int j=1;j<=n;j++){ if(vis[j]==0 && dist[j]>dist[pos]+map[pos][j]){ //j作为中间点(两个点相连要么直接连,要么通过中间点),判断直接连短还是通过其他点短 dist[j] = map[pos][j]+dist[pos]; } } } }

优先队列优化的dijistra: typedef pair<int,int> P ; std::vector<P> G[AX]; int dis[AX]; int vis[AX]; int num_road[AX]; void dijstra(){ priority_queue<P,vector<P>,greater<P> >q ; //按照距离从小到达排序 q.push(P(0,1)); // 距离 点 dis[1] = 0 ; num_road[1] = 1 ; while( !q.empty() ){ int u = q.top().second; int val = q.top().first; q.pop(); if( vis[u] ) continue; vis[u] = 1 ; if( val > dis[u] ) continue; for( int i = 0 ; i < (int)G[u].size() ; i++ ){ int v = G[u][i].first; int w = G[u][i].second; if( dis[v] > val + w ){ dis[v] = val + w ; q.push( P( dis[v] , v ) ); } } } }

转载请注明原文地址: https://www.6miu.com/read-58543.html

最新回复(0)