最短路径算法2——Bellman-Ford与SPFA算法
Bellman-Ford算法:
只能计算单源最短路径,时间复杂度为O(nm)n是顶点数,m是边数。
其实这个算法很简单,代码实现也很简单,大致和Floyed差不多吧。
循环n-1次,每次循环遍历所有边,必然会有一些边连接着蓝点与白点。因此每次都能用所有的白点去修改所有的蓝点。所以这个算法只是理论模拟了蓝点白点,并没有真正实现。
Bellman-Ford代码:
1 #include<cstdio> 2 #include<iostream> 3 #define N 42000 4 using namespace std; 5 int n,m,p,q,a[N],b[N],c[N],d[N]; 6 int main(){ 7 scanf("%d%d%d%d",&n,&m,&p,&q); 8 for(int i=1;i<=m;++i) 9 scanf("%d%d%d",&a[i],&b[i],&c[i]); 10 for(int i=1;i<=n;++i) 11 d[i]=42000000; 12 d[p]=0; 13 for(int i=1;i<n;++i) 14 for(int j=1;j<=m;++j) 15 d[b[j]]=min(d[b[j]],d[a[j]]+c[j]); 16 printf("%d",d[q]); 17 return 0; 18 }