Dijktra最短路径算法代码

其中包括测试程序,可直接编译运行

在Windows XP professional , Dev-cpp V4.9.9.0中编译通过

参考了计算机网络(第三版)

/************************************
**名称:Dijkstra路由算法示例
**程序编写:finytang
**日期:2005.4.10
**版本:1.0
*************************************/

#include <stdio.h>
#include <stdlib.h>

#define INFINITY 10000000  /*不可达*/
#define MAX_NODES 8    /*最大节点数*/

struct state     /*节点结构变量*/
{
    int predecessor;
    int length;
    enum {
        permanent = 0,
        tentative } label;
}state[MAX_NODES];

int n = MAX_NODES;

/*节点构成图,0表示不相邻*/
int dist[MAX_NODES][MAX_NODES] = {
                    {0,2,0,0,0,0,0,0},
                    {2,0,7,0,2,0,0,0},
                    {0,7,0,3,0,3,0,0},
                    {0,0,3,0,0,0,0,8},
                    {0,2,0,0,0,2,1,0},
                    {0,0,3,0,2,0,0,2},
                    {6,0,0,0,1,0,0,8},
                    {0,0,0,2,0,2,4,0}};

void Dijkstra_RA( int s, int t, int path[] );  /*核心算法函数,s开始节点,t结束结点,path最短路径*/
void OutputRoutData();        /*输出函数*/

int main(int argc, char *argv[])
{
  int path[MAX_NODES];
  int i;
  int s,t;
 
  for( i = 0; i < MAX_NODES; i++ )
  {
      path[i] = -1;
  }
  OutputRoutData();
 
  printf( "Enter the start node(0-%d):",MAX_NODES-1);
  scanf("%d",&s);
  printf( "Enter the end node(0-%d):",MAX_NODES-1);
  scanf("%d",&t);                              
  if( s < 0 || s > MAX_NODES-1 || t < 0 || t > MAX_NODES-1 || s==t )
  {
      printf("The shoortest path is not available/n");
      system("PAUSE"); 
      return 0;
  }                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              
  Dijkstra_RA( s , t, path );
  printf( "The shortest path is " );
  for( i = 0; i < MAX_NODES; i++ )
  {
      if(path[i]>=0)
      {
        printf( "%d ",path[i] );
      }   
  }
  printf( "/n" );
     
  system("PAUSE"); 
  return 0;
}

void Dijkstra_RA( int s, int t, int path[] )
{
    int i, k, min;
    struct state *p;
    for( p = state; p < state+n; p++ )
    {
        p->predecessor = -1;
        p->length = INFINITY;
        p->label = tentative;
    }
    state[t].length = 0;
    state[t].label = permanent;
    k = t;
    do
    {
        for( i = 0; i < n; i++ )
        {
            if( dist[k][i] != 0 && state[i].label == tentative )
            {
                if( state[k].length+dist[k][i] < state[i].length )
                {
                    state[i].predecessor = k;
                    state[i].length = state[k].length+dist[k][i];
                }
            }
        }
        k = 0;
        min = INFINITY;
        for( i = 0; i < n; i++ )
        {
            if( state[i].label == tentative && state[i].length < min )
            {
                min = state[i].length;
                k = i;
            }
        }
        state[k].label = permanent;
    }
    while( k != s );
   
    i = 0;
    k = s;
    do
    {
        path[i++] = k;
        k = state[k].predecessor;
    }
    while( k >= 0 );                                                                                                              
}

void OutputRoutData()
{
    int i,j;
    printf("   ");
    for(i=0; i<MAX_NODES; i++)
    {
        printf("< %d > ", i);
    }
    printf("/n");
    for (i=0; i<MAX_NODES; i++)
    {
        printf("%d   ", i);
        for (j=0; j<MAX_NODES; j++)
        {
            if (dist[i][j] == 0)
                printf(" -    ");
            else
                printf(" %d    ", dist[i][j]);
        }
        printf("/n");
    }
    printf("/n");

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值