求最短路径 SPFA
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 6 const int MAXN=1001; 7 const int INF=999999; 8 9 int map[MAXN][MAXN];//记录权值 10 int path[MAXN];//记录路径 11 int dis[MAXN];//记录最短值 12 int team[MAXN];//队列 13 bool visit[MAXN];//是否在队列中 14 int n,m,u,v,len,a,e; 15 16 void sc(int u)//求最短路径 17 { 18 int head=0,tail=1,p; 19 team[head]=u;//队列的第一个为起点 20 path[u]=u;//路径为起点 21 visit[u]=true;//标记为已在队列中 22 dis[u]=0;//起点的权值为0 23 while(head<tail) 24 { 25 p=team[head]; 26 for(int i=1;i<=n;i++) 27 { 28 if(dis[i]>dis[p]+map[p][i])//松弛 29 { 30 dis[i]=dis[p]+map[p][i]; 31 path[i]=p; 32 if(!visit[i])//如果不在队列中,重新入队 33 { 34 team[tail++]=i; 35 visit[i]=true;//标记已为在队列中 36 } 37 } 38 } 39 visit[p]=false;//将p标记为没在队列中 40 head++;//head后移,head所指向的元素依次出对 41 } 42 cout<<dis[e]<<endl;//输出最短路径的长度 43 } 44 45 void out(int b,int o)//输出最短路径的路径 46 { 47 int que[MAXN];//记录最短路径的路径 48 int tot=1; 49 que[tot]=o;//第一个为起点 50 tot++; 51 int temp=path[o]; 52 while(temp!=b)//将路径依次记录在que数组中 53 { 54 que[tot]=temp; 55 tot++; 56 temp=path[temp]; 57 } 58 que[tot]=b; 59 for(int i=tot;i>=1;i--)//输出路径 60 { 61 if(i!=1)//避免最后一个路径带有--> 62 cout<<que[i]<<"-->"; 63 else 64 cout<<que[i]; 65 } 66 } 67 68 int main() 69 { 70 cin>>n>>m; 71 for(int i=1;i<=n;i++)//初始化 72 for(int j=1;j<=n;j++) 73 map[i][j]=INF; 74 for(int i=1;i<=m;i++){ 75 cin>>u>>v>>len; 76 map[u][v]=len; 77 } 78 for(int i=1;i<=n;i++) 79 dis[i]=INF; 80 memset(visit,false,sizeof(visit)); 81 memset(team,0,sizeof(team)); 82 cin>>a>>e;//输入查找的起点和终点 83 sc(a); 84 out(a,e); 85 return 0; 86 }