Dijkstra算法(单源最短路径)
一.最短路径的最优子结构性质
二.Dijkstra算法
假设存在G=<V,E>,源顶点为V0,U={V0},dist[i]记录V0到i的最短距离,path[i]记录从V0到i路径上的i前面的一个顶点。
1.从V-U中dist[i]值最小的顶点i,将i加入到U中;
2.更新与i直接相邻顶点的dist值。(dist[j]=min{matrix[V0][j],dist[i]+matrix[i][j]})
3.知道U=V,停止。
#include <stdio.h>
#include<string.h>
#define MAX 201
#define INF 100000
int map[MAX][MAX];
int min[MAX];
int n, m;
void dij(int src){
int v[MAX];
int i, j, k;
for (i=0; i<n; ++i){
v[i] = 0;
min[i] = INF;
}
for (min[src]=0, i=0;i<n; ++i){
for (k=-1, j=0;j<n; ++j){
if (!v[j]&& (k == -1 || min[j] < min[k]))
k = j;
}
for (v[k]=1, j=0;j<n; ++j){
if (!v[j]&& min[k] + map[k][j] < min[j])
min[j] = min[k] + map[k][j];
}
}
}
int main(){
int i, j;
int a, b, x;
int s, t;
while (~scanf("%d%d", &n,&m)){
for (i=0; i<n; ++i)
for (j=0; j<n; ++j)
map[i][j] = INF;
for (i=0; i<m; ++i){
scanf("%d %d %d", &a,&b, &x);
if (x <map[a][b])
map[a][b] = map[b][a] = x;
}
scanf("%d %d", &s,&t);
dij(s);
if (min[t] == INF)
printf("-1\n");
else
printf("%d\n", min[t]);
}
return 0;
}