最短路 SPFA()鏈式前向星

  在極端狀況下,圖特別大,用鄰接鏈表也會超空間限制,此時須要用到鏈式前向星來存圖。c++

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 
 4 const int inf = INT_MAX / 10;
 5 const int num = ???;
 6 struct Edge{
 7     int to, next, w;//edge[i]的i就是起點,終點to,權值w,相同起點的下一條邊next 
 8 }edge[num];
 9 int n, m, cnt;
10 int head[num];//head[i]存放以i爲起點的下一條邊
11 int dis[num];
12 int inq[num];//標記節點是否在隊列中
13 int neg[num];//判負圈
14 int pre[num];//記錄前驅節點
15 
16 void print_path(int s, int t){
17     if(s==t)    {printf("%d",s);    return ;}
18     print_path(s, pre[t]);
19     printf("->%d",t);
20 }
21 
22 //初始化 
23 void init(){
24     for(int i=0; i<num; ++i){
25         edge[i].next = -1;
26         head[i] = -1;
27     }
28     cnt = 0;
29 }
30 
31 //加邊 
32 void addedge(int u, int v, int w){
33     edge[cnt].to = v;
34     edge[cnt].w  = w;
35     edge[cnt].next = head[u];//指向上一條同起點的邊 
36     head[u] = cnt;//存放以u爲起點的某條邊edge的下標 
37     cnt++;
38 }
39 
40 int spfa(int s){
41     for(int i=1; i<=n; ++i){
42         neg[i] = 0;
43         dis[i] = inf;
44         inq[i] = false;
45     }
46     neg[s] = 1;
47     dis[s] = 0;
48     
49     queue<int>q;
50     q.push(s);
51     inq[s] = true;
52     
53     while(!q.empty()){
54         int u = q.front();
55         q.pop();
56         inq[u] = false;
57         
58         for(int i=head[u]; ~i; i=edge[i].next){//~1 即 i!=-1 
59             int v = edge[i].to;
60             int w = edge[i].w;
61             if(dis[u] + w < dis[v]){
62                 dis[v] = dis[u] + w;
63                 pre[v] = u;
64                 if(!inq[v]){
65                     inq[v] = true;
66                     q.push(v);
67                     neg[v]++;
68                     if(neg[v] > n) return 1;//v的更新次數超過節點個數n,即說明存在負圈 
69                 }
70             }
71         }
72     }
73     //print_path(s,?);
74     return 0;
75 }
76 
77 int main(){
78     while(~scanf("%d %d", &n, &m) && n && m){
79         //初始化 
80         init();
81         //
82         while(m--){
83             int a, b, c;
84             scanf("%d %d %d", &a, &b, &c);
85             addedge(a, b, c);
86             addedge(b, a, c);
87         }
88         //
89         spfa(1);
90     }
91     return 0;
92 }

  相較原版的spfa(),結構體Edge中多了一個數據類型 next,用於存放同起點的上一條邊,這也是省空間的關鍵所在;同時須要用到的即 head[i],用於存放以 i 爲起點的某邊的 edge的下標。spa

相關文章
相關標籤/搜索