Bellman-ford(单源最短路)
基本原理:不断尝试对图上每一条边进行松弛。我们每进行一轮循环,就对图上所有的边都尝试进行一次松弛操作,当一次循环中没有成功的松弛操作时,算法停止。
特点:边权没有要求,可正可负,还可判断负权边.时间复杂度为O(nm)
代码实现
void bellman_ford(int s)
{
memset(dis,MM,sizeof(dis));
dis[s] = 0;
bool change;
for (int i = 0; i < n - 1; i++)
{
change = false;
for (int k = 0; k < m; k++)
{
if (dis[edge[k].to] > dis[edge[k].from] + edge[k].value)
{
change = true;
dis[edge[k].to] = dis[edge[k].from] + edge[k].value;
patch[edge[k].to]=edge[k].from;
}
}
if (change==false)
{
break;
}
}
}