在图中,我们可以指定一个点为起点,计算它到其余各点的最短路径。我们寻找一个与它之间最近的点,以此为基础不断的更新它经过此点到其他点的最短路,并重复这个过程,直到所有的点都被寻找一遍。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int MAXN = 100;
const int INF = 0x3f3f3f3f;
int MAP[MAXN][MAXN];
int dis[MAXN];
bool vis[MAXN];
int n, m;
void Dijkstra()
{
for(int cas = 1; cas < n; cas++)
{
int MIN = INF;
int k;
for(int i = 1; i <= n; i++)
{
if(vis[i] == false && dis[i] < MIN)
{
k = i;
MIN = dis[i];
}
}
vis[k] = true;
for(int i = 1; i <= n; i++)
{
if(dis[k] + MAP[k][i] < dis[i])
dis[i] = dis[k] + MAP[k][i];
}
}
return ;
}
int main()
{
while(~scanf("%d%d", &n, &m))
{
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
if(i == j) MAP[i][j] = 0;
else MAP[i][j] = INF;
int a, b, c;
for(int i = 1; i <= m; i++)
{
scanf("%d%d%d", &a, &b, &c);
MAP[a][b] = MAP[b][a] = c;
}
for(int i = 1; i <= n; i++)
dis[i] = MAP[1][i];
memset(vis, false, sizeof(vis));
vis[1] = true;
for(int i = 1; i <= n; i++)
printf("%d ", dis[i]);
printf("\n");
}
return 0;
}
可以根据需要适当修改细节
注意 : Dijkstra无法处理负权边,接下来要用Bellman-Ford!!!!!!