这是一个单源最短路线算法:寻找所有结点离起点的最短路线距离问题
#include<iostream>
#include<algorithm>
using namespace std;
const int MAXN = 1000;
const int INF = 10000000;
int n, m, s, G[MAXN][MAXN];//n是顶点个数,m是边数,s是起点的编号,G数组是储存两个顶点之间的边权
int d[MAXN];//存放每个节点到起点的最短距离
bool vis[MAXN] = { false };//表示这个点是否已经走过了
void Dijstra1(int s)
{
fill(d, d + MAXN, INF);
d[s] = 0;
for (int i = 0; i < n; i++)
{
int u = -1, MIN = INF;
for (int j = 0; j < n; j++)//这个循环用来寻找还没有走到过的结点中距离原点最小的点
{
if (vis[j] == false && d[j] < MIN)//如果这个点没走过并且是最短值
{
u = j;
MIN = d[j];
}
}
if (u == -1)
return;
vis[u] = true;
for (int v = 0; v < n; v++)//循环所有从上面找出来的结点u可以走到的所有结点
{
if (vis[v] == false && G[u][v] != INF && d[u] + G[u][v] < d[v])//如果这个结点还没有走过而且可以从u结点走到,并且可以进行优化
{
d[v] = d[u] + G[u][v];//优化d[v],更新这个最小值
}
}
}
}
int main()
{
int u, v, w;
cin >> n >> m >> s;//顶点个数,边数,起点编号
fill(G[0], G[0] + MAXN * MAXN, INF);
for (int i = 0; i < m; i++)
{
cin >> u >> v >> w;//输入相通的两个定点u和v之间的边权
G[u][v] = w;
}
Dijstra1(s);
for (int i = 0; i < n; i++)
{
cout << d[i] << " ";
}
system("pause");
return 0;
}