最短路径的两大算法

简介: 最短路径的两大算法

Floyd- Warshall算法:

这个算法就是让我们去寻找从点i到点j的距离,有以下两种情况:

(1). 两点直接到达的距离最短。

(2). 两点之间通过1个或者1个以上节点连接到达的距离最短。

其中主要代码只有五行,通过不同的点去中转看看中转之后的点到达的距离与直接到达是否小,如果小就更新距离。

#include<stdio.h>
int main()
{
  int e[10][10],k,i,j,n,m,t1,t2,t3;
  int inf=999999;//定义认为为正无穷大 
  scanf("%d%d",&n,&m);
  //初始化 
  for(i=1;i<=n;i++)
    for(j=1;j<=n;j++)
    {
      if(i==j)
        e[i][j]=0;
      else
        e[i][j]=inf;
    }
    //读入边 
    for(i=1;i<=m;i++)
    {
      scanf("%d%d%d",&t1,&t2,&t3);
      e[t1][t2]=t3;
    } 
    //主要算法 
    for(k=1;k<=n;k++)
      for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
          if(e[i][k]<inf&&e[k][i]<inf&&e[i][j]>e[i][k]+e[k][j])
            e[i][j]=e[i][k]+e[k][j];
    // 输入更新之后的边 
    for(i=1;i<=n;i++)
    {
      for(j=1;j<=n;j++)
      {
        printf("%10d",e[i][j]);
      }
      printf("\n");
    }
  return 0;   
} 

Dijkstra算法:

这个算法就是找到一个顶点,然后看看这个顶点到其他点的最小距离。如果到下一个顶点的距离比当前顶点大,九成新更新距离。

具体步骤:

1、将所有顶点分为两部分:已知最短距离路程的顶点集合P和未知最短路径的顶点集合Q。最开始,已知最短路径的顶点集合P只有一个顶点。我们这里用一个book记录那些点已经在集合P中。

2、设置源点s到自己的距离为0,若有源点能直接到达顶点,则距离为e[s][i],若不能到达此时距离为无穷大,这个我们定义99999999为无穷大。

3、在集合Q的所有顶点中选择离源点s最近的顶点u加入集合P中,并考察以u为起点的边,对每一条边进行松弛。

4、重复第3步,直到集合Q为空。

#include<stdio.h>
int main()
{
  int e[10][10],dis[10],book[10],i,j,n,m,t1,t2,t3,u,v,min;
  int inf=99999999;//无穷大 
  scanf("%d%d",&n,&m);
  //初始化 
  for(i=1;i<=n;i++)
    for(j=1;j<=n;j++)
      if(i==j)  e[i][j]=0;
      else    e[i][j]=inf;
  for(i=1;i<=m;i++)
  {
    scanf("%d%d%d",&t1,&t2,&t3);
    e[t1][t2]=t3; 
  }
  //初始化dis数组,这个是从1到其他顶点初始化 
  for(i=1;i<=n;i++)
    dis[i]=e[1][i];
  //book初始化 
  for(i=1;i<=n;i++)
    book[i]=0;
  book[1]=1;
  //算法核心 
  for(i=1;i<=n-1;i++)
  {
    min=inf;
    //找到离1号顶点最近的点 
    for(j=1;j<=n;j++)
    {
      if(book[j]==0&&dis[j]<min)
      {
        min=dis[j];
        u=j;
      }
    }
    book[u]=1;
    for(v=1;v<=n;v++)
    {
      if(e[u][v]<inf)
      {
        if(dis[v]>dis[u]+e[u][v])
          dis[v]=dis[u]+e[u][v];
      }
    }
  }
  for(i=1;i<=n;i++)
    printf("%d ",dis[i]);
  return 0;
}


相关文章
|
1月前
|
算法
Floyd 最短路径【学习算法】
Floyd 最短路径【学习算法】
35 0
|
2天前
|
算法
【经典LeetCode算法题目专栏分类】【第4期】BFS广度优先算法:单词接龙、最小基因变化、二进制矩阵中的最短路径
【经典LeetCode算法题目专栏分类】【第4期】BFS广度优先算法:单词接龙、最小基因变化、二进制矩阵中的最短路径
|
9天前
|
存储 算法 C语言
数据结构学习记录——图-最短路径问题(无权图单源最短路径算法、有权图单源最短路径算法、多源最短路径算法、Dijkstra(迪杰斯特拉)算法、Floyd算法)
数据结构学习记录——图-最短路径问题(无权图单源最短路径算法、有权图单源最短路径算法、多源最短路径算法、Dijkstra(迪杰斯特拉)算法、Floyd算法)
16 1
|
1月前
|
算法 机器人 Python
Python实现教程:平面最短路径算法
Python实现教程:平面最短路径算法
23 1
|
1月前
|
人工智能 算法
一些算法的复习(最短路径、最小生成树、dp)
一些算法的复习(最短路径、最小生成树、dp)
|
1月前
|
算法 定位技术 Windows
R语言最大流最小割定理和最短路径算法分析交通网络流量拥堵问题
R语言最大流最小割定理和最短路径算法分析交通网络流量拥堵问题
|
1月前
|
人工智能 算法 Java
【算法设计与分析】— —单源最短路径的贪心算法
【算法设计与分析】— —单源最短路径的贪心算法
40 0
|
1月前
|
算法 Java 图计算
图计算中的最短路径算法是什么?请解释其作用和常用算法。
图计算中的最短路径算法是什么?请解释其作用和常用算法。
28 0
|
1月前
|
算法
leetcode-675:为高尔夫比赛砍树 (最短路径算法bfs,dijkstra,A*)
leetcode-675:为高尔夫比赛砍树 (最短路径算法bfs,dijkstra,A*)
37 0
|
1天前
|
算法 JavaScript 决策智能
基于禁忌搜索算法的TSP路径规划matlab仿真
**摘要:** 使用禁忌搜索算法解决旅行商问题(TSP),在MATLAB2022a中实现路径规划,显示优化曲线与路线图。TSP寻找最短城市访问路径,算法通过避免局部最优,利用禁忌列表不断调整顺序。关键步骤包括初始路径选择、邻域搜索、解评估、选择及禁忌列表更新。过程示意图展示搜索效果。