SPFA是比较有名的最短路算法,但如何找到最短路路径是一个“难题”,下面给出一种方法。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
const int N=2500+5,M=6200+5;
struct edge
{
int u,v;
edge *next;
} e[M*2],*p=e,*point[N];
queue<int >Q;
inline void addedge(int x,int y,int z)
{ p++;p->u=y;p->v=z;p->next=point[x];
point[x]=p;
}
int dis[N],n,m,s,t,tt;
bool used[N];
int pre[N];
void SPFA()
{
memset(dis,0x7f,sizeof(dis));
memset(used,0,sizeof(used));
dis[s]=0;
Q.push(s);
used[s]=1;
while(!Q.empty())
{
s=Q.front();Q.pop();used[s]=0;
for(p=point[s];p;p=p->next)
{
if(dis[s]+p->v<dis[p->u])
{
dis[p->u]=dis[s]+p->v;
pre[p->u]=s;//这里是关键
if(!used[p->u]) used[p->u]=1,Q.push(p->u);
}
}
}
}
int main()
{
int x,y,z;
scanf("%d%d%d%d",&n,&m,&s,&t);
int xx=s;
for(int i=0;i<m;i++)
{
scanf("%d%d%d",&x,&y,&z);
addedge(x,y,z);
addedge(y,x,z);
}
SPFA();
tt=t;
printf("%d ",t);
while(tt!=xx)
{
tt=pre[tt];
printf("%d ",tt);
}//这个路径是倒着的,逆序处理即可
printf("\n");
printf("%d\n",dis[t]);
return 0;
}