*Floyd--Warshall
求任意两点间的最短路算法
它的核心算法就只有五行
for(k=1;k<=n;k++) for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(e[i][j]>e[i][k]+e[k][j]&&e[i][k]<inf&&e[k][j]<inf) e[i][j]=e[i][k]+e[k][j];
该算法for循环较多,时间复杂度为0(N^3),数据稍大则会超时,有局限性。
*Dijkstra--单源最短路
指定一个点到其余各顶点的最短路径。
for(i=1;i<=n-1;i++) { min=inf; for(j=1;j<=n;j++) { if(book[j]==0&&dis[j]<min) { min=dis[j]; u=j; } } book[u]=1; for(v=1;v<=n;v++) { if(e[u][v]<inf) { if(dis[v]>dis[u]+e[u][v]) dis[v]=dis[u]+e[u][v]; } } }
该算法时间复杂度为O(N^2),
*Bellman-Ford----解决负边权
核心代码
for(k=1;k<=n-1;k++) for(i=1;i<=n;i++) { if(dis[v[i]]>dis[u[i]]+w[i]) { dis[v[i]]=dis[u[i]]+w[i]; } }
与Dijkstra思想有相同之处。
菜鸟先写个大概吧