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 }