码迷,mamicode.com
首页 > 其他好文 > 详细

最短路径 简单的代码

时间:2014-07-31 09:34:55      阅读:219      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   for   代码   div   amp   size   

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

 

#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 ;
}

如果没有看懂 看看这个链接 不再患得患失 的文章


 

 

最短路径 简单的代码,布布扣,bubuko.com

最短路径 简单的代码

标签:style   blog   color   for   代码   div   amp   size   

原文地址:http://www.cnblogs.com/0307jtx/p/3879862.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!