看了这些代码之后 总结了一下 其实就那三个for 循环 一:找与v有连接的点 。二:从这些连接的点找到最小,把他看成是下一次的v 。 三: 你要把有出现的那些边 更新掉。 详解在代码里写出了
<span style="font-size:18px;">#include
#include
#include
using namespace std ;
#define N 100
#define M 100
typedef struct node {
int matrix[N][M] ;
int n ;
int e ;
}Dgraph ;
void DijistraPath(Dgraph g , int *dist , int *path , int V0)
{
int i , j ;
//申请两个 int 类型的 指针 visit 用来记录 某些点是否已经被访问过
bool *visit = (bool *) malloc(sizeof(bool )* g.n) ;
for(i = 0 ; i < g.n ; i++){
if(g.matrix[V0][i] > 0 && i != V0 )
{
dist[i] = g.matrix[V0][i] ;
path[i] = V0 ; //path记录最短路径上从v0到i的前一个顶点
}
else
{
dist [i] = INT_MAX ;
path[i] = -1 ;
}
visit[i] = false ; //这些i 都还没被访问过 先标记一下
path[V0] = V0 ;
dist[V0] = 0 ;
}
visit[V0] = true ;
//第一个循环是要把每个点 都进行 下面的操作 需要n 次
for(i = 1 ; i < g.n ; i++){
int u ; //用来记录 最小的那个点的 位置
int min = INT_MAX ;
// 找到最小的那个点
for(j = 0 ; j < g.n ; j++ ){
if(visit[j] == false && dist[j] < min )
{
min = dist[j] ;
u = j ;
}
}
visit[u] = true ;
//下面我们要把 dist 更新一遍 因为可能V0 到某个点直接距离 比 从其他路线还要长
//所以把那个dist 改成 更短的
for(i = 0 ; i < g.n ; i++ ){
if(visit[i] == false && g.matrix[u][i] > 0 && min + g.matrix[u][i] < dist[i])
{
dist[i] = min + g.matrix[u][i] ;
path[i] = u ;
}
}
}
}
int main()
{
int i , j ;
int n , e ;
int V0 ;
int s , t , w ;
int x ;
Dgraph g ;
while(cin>>n>>e && e != 0)
{
// disti[] 用来放从 原点到第i个的最短距离
//path[i] 用来放 i被访问的前一个点
int *dist = (int *)malloc(sizeof(int)*n) ;
int *path = (int *)malloc(sizeof(int)*n ) ;
// 先把g.matrix(就是权值)初始化
for(i = 0 ; i < N ; i++){
for(j = 0 ; j < M ; j++){
g.matrix[i][j] = 0 ;
}
}
g.n = n ;
g.e = e ;
//这里是输入 每条边的 权值
for(i = 0 ;i < e ;i++ ){
cin>>s>>t>>w ;
g.matrix[s][t] = w ;
}
cin>>V0; //输入原点
DijistraPath( g , dist , path , V0) ;
cin>>x; cout<<dist[x] ;
}
return 0 ;
}
如果没有看懂 看看这个链接 不再患得患失 的文章</span>