日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

spfa_队列

發布時間:2025/3/15 编程问答 12 豆豆
生活随笔 收集整理的這篇文章主要介紹了 spfa_队列 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

spfa:
1.當給定的圖存在負權邊時,Dijkstra等算法便沒有了用武之地,而Bellman-Ford算法的復雜度又過高,SPFA算法便派上用場了.
2.我們約定有向加權圖G不存在負權回路,即最短路徑一定存在
3.思路:
用數組d記錄每個結點的最短路徑估計值,而且用鄰接表來存儲圖G。我們采取的方法是動態逼近法:設立一個先進先出的隊列用來保存待優化的結點,優化時每次取出隊首結點u,并且用u點當前的最短路徑估計值對離開u點所指向的結點v進行松弛操作,如果v點的最短路徑估計值有所調整,且v點不在當前的隊列中,就將v點放入隊尾。這樣不斷從隊列中取出結點來進行松弛操作,直至隊列空為止。
4.實現方法:
建立一個隊列,初始時隊列里只有起始點,在建立一個表格記錄起始點到所有點的最短路徑(該表格的初始值要賦為極大值,該點到他本身的路徑賦為0)。然后執行松弛操作,用隊列里有的點去刷新起始點到所有點的最短路,如果刷新成功且被刷新點不在隊列中則把該點加入到隊列最后。重復執行直到隊列為空.
代碼:

View Code 1 #include <iostream> 2 #include <memory.h> 3 #include <stdio.h> 4 #include <queue> 5 using namespace std; 6 const int maxp=1000; 7 const int maxe=1000; 8 const int maxnum=1000; 9 struct edge 10 { 11 int v; 12 int w; 13 int next; 14 }edge[maxe]; 15 16 typedef struct 17 { 18 int d; 19 int pre; 20 }pp; 21 pp point[maxp]; 22 int p,e; 23 24 queue<int> q; 25 bool use[maxp]; 26 27 void Init() 28 { 29 int i; 30 for(i=1;i<=p;i++) 31 { 32 point[i].d=maxnum; 33 point[i].pre=-1; 34 } 35 int u,v,w; 36 int index=1; 37 for(i=1;i<=e;i++) 38 { 39 cin>>u>>v>>w; 40 edge[index].v=v; 41 edge[index].w=w; 42 edge[index].next=point[u].pre; 43 point[u].pre=index; 44 index++; 45 } 46 } 47 48 void spfa(int s) 49 { 50 memset(use,false,sizeof(use)); 51 point[s].d=0; 52 q.push(s); 53 use[s]=true; 54 int t,i; 55 while(!q.empty()) 56 { 57 t=q.front(); 58 use[t]=false; 59 q.pop(); 60 for(i=point[t].pre;i!=-1;i=edge[i].next) 61 { 62 int v=edge[i].v; 63 int w=edge[i].w; 64 if(point[v].d>point[t].d+w) 65 { 66 point[v].d=point[t].d+w; 67 if(!use[v]) 68 { 69 q.push(v); 70 use[v]=true; 71 } 72 } 73 } 74 } 75 } 76 77 int main() 78 { 79 cin>>p>>e; 80 Init(); 81 spfa(1); 82 int i; 83 for(i=1;i<=p;i++) 84 cout<<i<<" "<<point[i].d<<endl; 85 return 0; 86 } 87 88 /* 89 5 10 90 1 2 10 91 1 3 5 92 2 3 2 93 2 4 1 94 3 2 3 95 3 4 9 96 3 5 2 97 4 5 4 98 5 1 7 99 5 4 6 100 */

?5.判斷有無負環:如果某個點進入隊列的次數超過N次則存在負環 ( 存在負環則無最短路徑,如果有負環則會無限松弛,而一個帶n個點的圖至多松弛n-1次)

轉載于:https://www.cnblogs.com/pushing-my-way/archive/2012/08/05/2624271.html

總結

以上是生活随笔為你收集整理的spfa_队列的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。