迪杰斯特拉算法和prim算法十分相似,两者只是松弛操作不同。
模板题:POJ2387
迪杰斯特拉算法用来解决单源最短路问题。单源最短路:求一个确定点到其他任意点的最短距离
该算法主要步骤如下:
具体思路及代码实现见注释:
int m, n; //路径总数、结点个数
int d[MAX]; //d[i]记录i到起点的最短距离
int t[MAX]; //t[i]记录i是否以及加入图
int mp[MAX][MAX]; //邻接矩阵
void intt() //初始化数据
{
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
if (i == j)
mp[i][j] = 0;
else
mp[i][j] = INF;
fill(t, t + MAX, 0);
fill(d, d + MAX, INF);
}
void dj(int s)
{
d[s] = 0; //将起点到起点的距离初始化0
for (int i = 1; i <= n; i++) //迪杰斯特拉算法同prim,每次将一个点压入图中,因此只需n次循环即可
{
int v;
int minn = INF;
for (int j = 1; j <= n; j++) //找到当前图外离起点最近的点
if (!t[j] && d[j] < minn)
{
minn = d[j];
v = j;
}
t[v] = 1; //将v压入图中
for (int j = 1; j <= n; j++)
d[j] = min(d[j], d[v] + mp[j][v]);
//松弛操作,因为这次循环将v压入图中了,
//因此需要遍历更新所有与v相连的结点到起点的距离,
//也就是比较1.j点直接到起点 2.j点经过v点到起点,
//这两者哪个更近
}
}
int main()
{
cin >> m >> n;
intt();
while (m--)
{
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
if (mp[a][b] > c)
mp[a][b] = mp[b][a] = c;
}
dj(1);
cout << d[n] << endl;
return 0;
}