21xrx.com
2024-11-25 08:58:17 Monday
登录
文章检索 我的文章 写文章
Dijkstra算法C++代码
2023-07-01 09:12:01 深夜i     --     --
Dijkstra 算法 C++ 代码

Dijkstra算法是一种用于在加权有向图或加权无向图中找到最短路径的算法。该算法被称为“单源最短路径问题”的解决方案,即找到一个顶点到其余所有顶点的最短路径。

C++是一种常用的编程语言,在实现Dijkstra算法时也可以使用C++来编写代码。下面是一个基于C++的Dijkstra算法的实现代码,供参考:


#include<iostream>

#include<cstdio>

#include<cstring>

using namespace std;

const int INF=0x3f3f3f3f; // 定义一个极大值,表示无穷大

int n,m; // n表示顶点数目,m表示边数目

int s,t,cnt; // 起点、终点和计数器

int head[1010],dis[1010]; // 邻接表头和最短距离

struct node

w表示边的权值

  int next; // 指向下一条边的指针

edge[10010]; // 最多m条边,定义为结构体数组

void add(int u,int v,int w) // 添加边

{

  cnt++;

  edge[cnt].v=v;

  edge[cnt].w=w;

  edge[cnt].next=head[u];

  head[u]=cnt;

}

void dijkstra(int s) // Dijkstra算法

{

  bool vis[1010]={0};  // 标记数组,标记每个点是否已经被访问

  for(int i=1;i<=n;i++)

  {

    dis[i]=INF;

  }

  dis[s]=0;

  for(int i=1;i<n;i++)

  {

    int k=0;

    for(int j=1;j<=n;j++)

    {

      if(!vis[j]&&(k==0||dis[j]<dis[k]))

        k=j;

    }

    vis[k]=1;

    for(int j=head[k];j;j=edge[j].next)

    {

      int v=edge[j].v;

      if(dis[v]>dis[k]+edge[j].w)

      {

        dis[v]=dis[k]+edge[j].w;

      }

    }

  }

}

int main()

{

  scanf("%d%d%d%d",&n,&m,&s,&t);

  int u,v,w;

  cnt=0;

  memset(head,0,sizeof(head));

  for(int i=1;i<=m;i++) // 输入每条边的起点、终点和权值

  {

    scanf("%d%d%d",&u,&v,&w);

    add(u,v,w);

    add(v,u,w); // 如果是无向图,需要加上反向边

  }

  dijkstra(s);

  printf("%d\n",dis[t]); // 输出从起点到终点的最短距离

  return 0;

}

该代码实现了Dijkstra算法,首先输入顶点数目、边数目、起点和终点,然后输入每条边的起点、终点和权值,将边存储到邻接表中,最后调用dijkstra函数计算从起点到终点的最短路径。最后输出从起点到终点的最短距离。

总的来说,通过使用C++编写Dijkstra算法的代码,可以很方便地实现在加权有向图或加权无向图中找到最短路径的问题。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复