最短路径 简单的代码

来源:互联网 发布:3d照相机软件 编辑:程序博客网 时间:2024/06/14 06:26

看了这些代码之后 总结了一下 其实就那三个for 循环 一:找与v有连接的点 。二:从这些连接的点找到最小,把他看成是下一次的v   。 三: 你要把有出现的那些边 更新掉。 详解在代码里写出了 

<span style="font-size:18px;">#include#include#includeusing namespace std ;#define N 100#define M 100typedef 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>


0 0
原创粉丝点击