n:点数
m:边数
e[ ][ ]:邻接矩阵
Floyd-Warshall
代码实现
for(int k = 1; k <= n; k++) // 选定新中转点编号
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++) // 选定一条i->j的路径
if(e[i][j]>e[i][k]+e[k][j])
e[i][j] = e[i][k]+e[k][j]; // 更新矩阵
Dijkstra
邻接矩阵
代码实现
for(int i = 1; i < n; i++) // 重复n-1次
{
int min = INF; // 最短距离
int u = 0;
for(int j = 1; j <= n; j++)
{
if(book[j]==0 && dis[j]<min)
{
min = dis[j];
u = j;
}
}
book[u] = 1; // 选取最短路径点编号
for(int k = 1; k <= n; k++)
{
if(e[u][k]!=INF)
{
if(dis[k]>dis[u]+e[u][k])
dis[k]=dis[u]+e[u][k];
}
}
}
邻接表
存储
for(int i = 1; i <= m; i++) // i为边的编号
{
cin>>u[i]>>v[i]>>w[i]; // 从u[i]到v[i]的边权重w[i]
next[i] = first[u[i]]; // i边的同起点的上一条
first[u[i]] = i;
}
// 对dis赋初值
for(int i = first[1]; i!=-1; i = next[i])
{
dis[v[i]] = w[i];
}
for(int i = 1; i < n; i++)
{
int Min = INF;
int u = 0;
for(int j = 2; j <= n; j++)
{
if(book[j]==0 && dis[j]<Min)
{
Min = dis[j];
u = j;
}
}
book[u] = 1;
for(int k = first[u]; k!=-1; k = next[k])
{
if(dis[v[k]]>dis[u]+w[k])
{
dis[v[k]]=dis[u]+w[k];
}
}
}
Bellman-Ford
代码实现
for(int i = 1; i <= m; i++) // 看看能否通过u[i]->v[i](权值w[i])这条边,缩短1->v[i]的距离
if(dis[v[i]] > dis[u[i]]+w[i])
dis[v[i]] = dis[u[i]]+w[i];