首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > C/C++ > 最短路径算法实现
【标  题】:最短路径算法实现
【关键字】:
【来  源】:http://blog.csdn.net/greenkugua/archive/2006/11/07/1371038.aspx

最短路径算法实现

// ShorttestPath.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "stdio.h"
#include "conio.h"
#define INFINITY 32767
//入口参数:Graph是图的矩阵表示;
//row 是矩阵的行数;
//v0是起点的序号;
//final[i]记录从起点到第i个节点是否有路可达;


void ShortestPath_DIJ(int G[6][6],int P[6][6],int D[6],int row,int v0,bool final[])
{
 for(int v = 0;v<row;++v)
 {
  final[v] = false;
  D[v] = G[v0][v];
  for(int w = 0;w<row;++w)P[v][w] = false;//设空路径;
  if(D[v]<INFINITY)
  {
           P[v][v0] = true;
     P[v][v] = true;//自己是可以到达的;
  }
 }
 D[v0] = 0;final[v0] = true;//初始化,v0的顶点属于集合s;
 //final作为标志,final[v]为false说明v在v中,否则在s中;
 //开始主循环,每次求得v0到某个v顶点的最短路径,并加v到s集;
    for(int i = 0;i<row;++i)
 {
        int min = INFINITY;
  for(int w = 0;w<row;++w)
           if(!final[w])//w在v-s中;
       if(D[w]<min)
    {
     v = w;
     min = D[w];//w顶点离v0更近;
    }//查找当前行中权值最小的节点;
     final[v] = true;//将其加入s
  for(w = 0;w<row;++w)//更新当前最短路径及距离;
  {
   if(final[w] && (min+G[v][w]<D[w]))//修改D[w]和P[w],w属于v-s
   {//如果在s中已有的路径比经过v后在到达还要远,就选择通过v点;
               D[w] = min + G[v][w];
      P[i][w] = w; //P数组记录的是要到达i节点需要经过的节点;    
      P[w][w] = true;
   }
  }
 }
 for(i =0;i<row;i++)
  for(int j = 0;j<row;j++)
  {
   printf("\tv%d:%d",i,P[i][j]);
  }
}
int main(int argc, char* argv[])
{
 int G[6][6] = {
    INFINITY,INFINITY,10   ,INFINITY,30      ,100     ,
 INFINITY,INFINITY,5    ,INFINITY,INFINITY,INFINITY,
 INFINITY,INFINITY,INFINITY,50      ,INFINITY,INFINITY,
 INFINITY,INFINITY,INFINITY,INFINITY,INFINITY,10      ,
 INFINITY,INFINITY,INFINITY,20      ,INFINITY,60      ,
 INFINITY,INFINITY,INFINITY,INFINITY,INFINITY,INFINITY
 };
 int D[6] ={
 INFINITY,INFINITY,INFINITY,INFINITY,INFINITY,INFINITY
 };
 int P[6][6];
 bool final[6];
    ShortestPath_DIJ(G,P,D,6,1,final);
 return 0;
}
 

多功能计算器:【上一篇】
指针类型转换后, 指针值会改变:【下一篇】
【相关文章】
没有相关文章
【随机文章】
  • C++指针直接调用类成员函数探讨
  • 如何在网页中设置禁止查看源文件!
  • Linux 运行级init详解
  • 插件系统·关系模式-万能观察者
  • 在Redhat linux 7.3中轻松安装新字体
  • 设置scim为默认输入法
  • ASP能读写注册表
  • 用PHP控制FTP文件上传
  • C++ template 语法需要注意的问题!
  • 第二章. 基于面向对象分析和设计(OOA&D)的UML
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 软讯网络 All Rigths Reserved.