两次运用SPFA算法求最短路,所用的地图是相互反向的,采用的是邻接表表示
1 #include<iostream> 2 using namespace std; 3 #include<queue> 4 #include<cstdio> 5 #include<cstring> 6 #define INF 20000000 7 #define MAXN 1010 8 struct node 9 { 10 int to; 11 int w; 12 node * next; 13 }; 14 15 node * edge1[MAXN]; 16 node * edge2[MAXN]; 17 int vis[MAXN]; 18 int dist1[MAXN]; 19 int dist2[MAXN]; 20 int N,M,X; 21 void SPFA(int x,int dist[],node *edge[]) 22 { 23 int u; 24 node *temp; 25 for(int i=1;i<=N;i++) 26 { 27 dist[i]=INF; 28 vis[i]=0; 29 } 30 queue<int> q; 31 dist[x]=0; 32 q.push(x); 33 while(!q.empty()) 34 { 35 u=q.front(); 36 q.pop(); 37 vis[u]=0; 38 temp=edge[u]; 39 while(temp!=NULL) 40 { 41 int v=temp->to; 42 if(dist[v]>dist[u]+temp->w) 43 { 44 dist[v]=dist[u]+temp->w; 45 if(!vis[v]) 46 { 47 q.push(v); 48 vis[v]=1; 49 } 50 } 51 temp=temp->next; 52 } 53 } 54 } 55 int main() 56 { 57 while(scanf("%d%d%d",&N,&M,&X)!=EOF) 58 { 59 int a,b,c; 60 node * temp; 61 memset(edge1,0,sizeof(edge1)); 62 memset(edge2,0,sizeof(edge2)); 63 for(int i=0;i<M;i++) 64 { 65 scanf("%d%d%d",&a,&b,&c); 66 temp=new node; 67 temp->w=c; 68 temp->to=b; 69 temp->next=NULL; 70 if(edge1[a]==NULL) edge1[a]=temp; 71 else 72 { 73 temp->next=edge1[a]; 74 edge1[a]=temp; 75 } 76 temp=new node; 77 temp->w=c; 78 temp->to=a; 79 temp->next=NULL; 80 if(edge2[b]==NULL) edge2[b]=temp; 81 else 82 { 83 temp->next=edge2[b]; 84 edge2[b]=temp; 85 } 86 87 } 88 SPFA(X,dist1,edge1); 89 SPFA(X,dist2,edge2); 90 int max=0; 91 for(int i=1;i<=N;i++) 92 { 93 if(max<dist1[i]+dist2[i]) 94 { 95 max=dist1[i]+dist2[i]; 96 } 97 } 98 printf("%d\n",max); 99 100 } 101 return 0; 102 }