最短路径 (C语言版)

本文介绍了一种基于C语言实现的最短路径算法。通过定义结构体和二维数组来存储节点间距离,并采用动态规划思想逐步求解从起始节点到各节点的最短路径。该算法适用于小规模图的最短路径问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最短路径算法

#include<stdio.h>

#define N 11

#define M 1000000

struct node

{

       int num; //本来序号

       int lin; //临时性标记

};

 

void main()

{

       int i,j,t,k,m,test;

       node l[N+1];

       int w[N+1][N+1]={0};

       int cnt=0;//统计节点数

       int c[N+1]={0}; //存放节点

 

w[1][2]=676;

w[1][3]=1813;

w[2][4]=842;

w[2][5]=511;

w[3][5]=695;

w[3][6]=811;

w[4][7]=110;

w[4][8]=967;

w[5][9]=943;

w[6][10]=1376;

w[7][8]=639;

w[8][9]=902;

w[8][11]=607;

w[9][10]=367;

w[9][11]=672;

 

for(i=1;i<N+1;i++)

   for(j=1;j<N+1;j++)

    if(w[i][j] ==0)

            w[i][j]=M;

 

       for(i=1;i<N+1;i++)

      l[i].num=i;

           l[1].lin=0;

         

          for(i=2;i<N+1;i++)

                 l[i].lin=M;

 

          for(i=2;i<N+1;i++)

                 l[i].lin=w[1][i];

 

 

          for(i=2;i<N+1;i++)

          {

                 for(j=i;j<N+1;j++)

                 {

                        t=l[i-1].lin+w[i-1][j];

                        if(t<l[j].lin)

                               l[j].lin=t;

                 }

                    

                 for(k=1;k<N+1;k++)

                     printf("%d ",l[k].lin);

                     printf("\n");

             

                

                    test= l[i].lin;

                       m=i;

                       for(k=m;k<N+1;k++)

                       {

                              if(test>l[k].lin)

                              {

                                     test=l[k].lin;

                                     m=k;

                              }

                       }

 

                     if(m !=i)

                     {

                            node temp = l[i];

                            l[i]=l[m];

                            l[m]=temp;

                     }

                

             

          }

      

                  for(k=1;k<N+1;k++)

                               for(m=k+1;m<N+1;m++)

                                      if(l[k].num>l[m].num)

                                      {

                                             node temp=l[k];

                                             l[k]=l[m];

                                             l[m]=temp;

                                      }

   

 

              i=N;

              j=N-1;

 

       while(j>0)

       {

              if(l[i].lin == l[j].lin+w[j][i])

              {

                     i=j;

                     c[cnt]=j;

                     cnt++;

                     j--;

              }

              else

              j--;

       }

 

       printf("最短路径如下:\n");

       for(i=cnt-1;i>=0;i--)

       {

       printf("p-->[%d]\n",c[i]);

       }

 

              printf("p-->[%d]\n",N);

             

                       

}

转载于:https://www.cnblogs.com/zhanggaosong/p/3145727.html

### Dijkstra 最短路径算法的 C 语言实现 Dijkstra 算法是一种经典的单源最短路径算法,适用于带权有向图或无向图中的最短路径求解问题。以下是基于站内引用的内容以及专业知识整理出的一个完整的 C 语言实现。 #### 算法核心逻辑 Dijkstra 算法的核心思想是通过贪心策略逐步扩展已知的最短路径集合。每次从未处理节点中选取距离起点最近的节点加入到已知集合中,并更新其邻接节点的距离[^1]。 #### 数据结构设计 为了高效实现该算法,在程序中通常会使用二维数组来表示加权图的邻接矩阵形式。此外还需要辅助的一维数组存储当前各顶点至起始点之间的最小代价(即最短路径长度),并记录哪些顶点已被访问过以避免重复计算[^2]。 下面展示了一个标准版本的C语言代码: ```c #include <stdio.h> #define MAXVEX 100 /* 定义最大顶点数 */ #define INF 0x7fffffff /* 表示无穷大 */ int graph[MAXVEX][MAXVEX]; /* 邻接矩阵 */ int dist[MAXVEX]; /* 存储从源点到其他各点的最短路径长度 */ int prev_node[MAXVEX]; /* 记录前驱结点用于构建最终路径 */ bool visited[MAXVEX]; /* 标记某顶点是否已经被纳入最短路径树 */ /* 初始化函数 */ void init(int n){ int i,j; for (i=0;i<n;i++) { for(j=0;j<n;j++){ if(i==j)graph[i][j]=0; else graph[i][j]=INF; } } } /* 打印最短路径及其长度 */ void printPath(int start,int end){ if(prev_node[end]==-1 && start!=end){ printf("No Path\n"); return ; } if(start != end){ printPath(start,prev_node[end]); } printf("%d ",end); } /* 主体 dijkstra 函数 */ void dijkstra(int vnum, int src){ int i,min_index; // 初始状态设置 for(i=0;i<vnum;i++){ dist[i]=(graph[src][i]==INF)?INF:graph[src][i]; prev_node[i]=-1; if(graph[src][i]!=INF&&src!=i){ prev_node[i]=src; } visited[i]=false; } dist[src]=0; visited[src]=true; // 进行vnum-1轮迭代过程 for(i=1;i<=vnum-1;i++){ min_index=-1; // 寻找未被标记且具有最小dist[]值的顶点作为新的候选者 for(int j=0; j<vnum ;j++) if(!visited[j]){ if(min_index==-1 || dist[j]<dist[min_index]) min_index=j; } if(min_index == -1 ) break;// 如果找不到合适的下一个节点则退出 visited[min_index]=true; // 更新与新选定点相邻的所有其它尚未确定最短路径的顶点们的估计值 for(int k=0;k<vnum;k++){ if(!visited[k]&&(graph[min_index][k]+dist[min_index])<dist[k]){ dist[k]=graph[min_index][k]+dist[min_index]; prev_node[k]=min_index; } } } } ``` 上述代码实现了基本功能,包括初始化阶段、主要循环部分以及打印具体路径的方法定义[^3]。 #### 注意事项 当调用此方法之前需先填充好`graph[][]`,它代表各个城市间可能存在的直接连接关系权重;如果两地点之间不存在直达线路,则应设为极大数值(INF),表明不可达情况存在。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值