用Dijkstra算法

用Dijkstra算法,我做的给你个参考,下面各点是有距离的(移动力),BIG表示不可通过

#define BIG 32767 //无穷大
int pre[6]={0}; //这是关键!pre数组用于记录每个点的前趋,这样算出最短路径后,就可以递归出路径经过的点
int Distance[6]; //用于记录从起点到达每个点的最短路径长度
int Cost[6][6]={{0,1450,1650,BIG,BIG,BIG}, //有向网的邻接矩阵,这里以6个点为例
        {1450,0,BIG,1350,2350,BIG},
        {1650,BIG,0,BIG,2550,BIG},
        {BIG,1350,BIG,0,BIG,1200},
        {BIG,2350,2550,BIG,0,850},
        {BIG,BIG,BIG,1200,850,0},
        };

//Dijkstra算法函数,求给定点到其余各点的最短路径
//参数:邻接矩阵、顶点数、出发点的下标、结果数组、每个点的前趋
void Dijkstra(int Cost[][6],int n,int v0,int Distance[],int pre[])
{
  int s[6];
  int mindis,dis;
  int i,j,u;
  //初始化
  for(i=0;i<n;i++) {
    Distance[i]=Cost[v0][i];
    s[i]=0;
  }
  s[v0] =1; //标记v0
  //在当前还未找到最短路径的顶点中,寻找具有最短距离的顶点
  for(i=0;i<n;i++){
    if(Distance[i]<BIG) pre[i]=v0;
  }
  for(i=1;i<n;i++) { //每循环一次,求得一个最短路径
    mindis=BIG;
    for (j=0;j<n;j++) //求离出发点最近的顶点
      if(s[j]==0&&Distance[j]<mindis) {
        mindis=Distance [j];
        u=j;
      }
    for(j=0;j<n;j++) //修改递增路径序列(集合)
      if(s[j]==0) { //对还未求得最短路径的顶点
        //求出由最近的顶点 直达各顶点的距离
        dis=Distance[u] +Cost[u][j];
        //如果新的路径更短,就替换掉原路径
        if(Distance[j]>dis){
          Distance[j]=dis;
          pre[j]=u;
        }
      }
    s[u]=1; // 标记最短路径已经求得
  }
}

用Dijkstra函数算出最短路径后,就可以递归出从给定顶点到各点的最短路径上的每个点了,函数如下(不含终点):

char pathres[100]=""; //保存路径
char *Vertex[6]={"福州","上海","广州","北京","成都","西安"};
//参数:起点、终点
void shpath(int st,int ed) //起点应该为Dijkstra函数中的v0
{
  if(pre[ed]!=st){
    shpath(st,pre[ed]);
  }
  strcat(pathres,Vertex[pre[ed]]);
  strcat(pathres,"-");
} //最后要在主函数中把终点加到pathres里

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值