SPFA算法O(kE)

SPFA算法O(kE)
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 using namespace std;
 5 int que[1000];
 6 int map[1000][1000];
 7 int iss[1000];
 8 int dis[1000];
 9 int path[1000];
10 int n,m,w,x,y,aa,bb;
11 const int maxn=999999;
12 void ff(int u)
13 {
14     int head=0;
15     int tail=1;
16     que[head]=u;
17     iss[u]=1;
18     dis[u]=0;
19     path[u]=u;
20     int p;
21     do
22     {
23         p=que[head];
24         for(int i=1;i<=n;i++)
25          {
26              if(dis[i]>dis[p]+map[p][i])
27               {
28                   dis[i]=dis[p]+map[p][i];
29                   path[i]=p;
30                   if(iss[i]==0)
31                    {
32                        tail++;
33                        que[tail]=i;
34                        iss[i]=1;
35                    }
36               }
37          }
38          iss[p]=0;
39          head++;
40     }while(head!=tail);
41     cout<<dis[bb]<<endl;
42 }
43 void print(int q,int p)
44 {
45     int qq[1000];
46     int tot=1;
47     qq[tot]=p;
48     int temp=path[p];
49     while(temp!=q)
50      {
51          tot++;
52          qq[tot]=temp;
53          temp=path[temp];
54      }
55      tot++;
56      qq[tot]=q;
57      for(int i=tot;i>1;i--) 
58       {
59           cout<<qq[i]<<"-->";
60       }
61       cout<<qq[1];
62 }
63 int main()
64 {
65     cin>>n>>m;
66     memset(map,maxn,sizeof(map));
67     for(int i=1;i<=m;i++)
68      {
69          cin>>x>>y>>w;
70          map[x][y]=w;
71      }
72     memset(iss,0,sizeof(iss));
73     memset(dis,maxn,sizeof(dis));
74     cin>>aa>>bb;
75     ff(aa);
76     print(aa,bb);
77     return 0;
78 }

原文地址:https://www.cnblogs.com/lyqlyq/p/6689650.html