Dijkstra算法:基本思想是每次找到离源点最近的一个顶点,然后以该顶点为中心进行扩展,通过边来松弛源点到其余各个顶点的路程,最终得到源点到其余所有点的最短路径。
代码:
#include <iostream>
#include <vector>
using namespace std;
const int MAX = 99999;
int main()
{
int m, n; //m表示边的条数,n表示顶点个数
std::cin >> n >> m;
//边,初始化“边”二维数组
std::vector<vector<int>>e;
e.resize(n+1);
for (int i = 0; i <= n; i++)
e[i].resize(n+1);
for (int i = 1; i <=n; i++)
{
for (int j = 1; j <= n; j++)
{
if (i == j)
e[i][j] = 0;
else
e[i][j] = MAX;
}
}
//读入边
for (int i=1;i<=m;i++)
{
int t1, t2, t3; //起点,末点,权值
std::cin >> t1 >> t2 >> t3;
e[t1][t2] = t3;
}
std::vector<int>dis; //存储已知最短路径点的Q集合
::fill_n(::back_inserter(dis), n+1, 0);
//初始化dis集合,源点s直接能到达的点i,初始设成e[s][i],不能直接到达的设成MAX
for (int i = 1; i <= n; i++)
dis[i] = e[1][i];
std::vector<int>book;
::fill_n(::back_inserter(book),n+1,0);
book[1] = 1;
//Dijkstra算法
for (int i=1;i<=n-1;i++)
{
int u;
//找到离当前源点最近的点
int min = MAX;
for (int j=1;j<=n;j++)
{
if (book[j]==0 && dis[j]<min)
{
min = dis[j];
u = j; //将此点记录下来
}
}
book[u] = 1;
//以u点进行扩展
for (int v=1;v<=n;v++)
{
//判断两点间是否存在边
if (e[u][v]<MAX)
{
if (dis[v]>dis[u]+e[u][v])
{
dis[v] = dis[u] + e[u][v];
}
}
}
}
std::cout << endl;
for (int i=1;i<=n;i++)
{
std::cout << dis[i] << " ";
}
::getchar(); ::getchar();
return 0;
}