Dijkstra算法(求一点到任意一点的最短距离)

思路:先找出最短的一个点,也就是起点,从起点出发,找最短的边,同时标记起点为true(代表已经访问过),访问过的点就不用再访问了,依次下去,保证每一次找到的边都是最短的边

到最后没有边可以更新了就代表结束

看代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<stdio.h>
#include<string.h>
#include<cmath>
#include<math.h>
#include<algorithm>
#include<set>
#include<queue>
#include<map>
typedef long long ll;
using namespace std;
const ll mod=1e9+7;
const int maxn=1e3+10;
const int maxk=100+10;
const int maxx=1e4+10;
const ll maxe=1000+10;
#define INF 0x3f3f3f3f3f3f
int v,e;
ll cost[maxn][maxn];//cost[u][v]代表边(u,v)的权值
ll d[maxn];//从起点出发到该点的最小距离
bool vis[maxn];
void solve(int s)
{
    for(int i=0;i<v;i++)
    {
        d[i]=INF;
    }
    memset(vis,false,sizeof(vis));
    d[s]=0;
    while(true)
    {
        int flag=-1;
        for(int i=0;i<v;i++)
        {
            //在所有点中找尚未使用的最小距离的点
            if(!vis[i]&&(flag==-1||d[i]<d[flag]))
            flag=i;
        }
        if(flag==-1)
            break;
        vis[flag]=true;
        for(int i=0;i<v;i++)
        {
            d[i]=min(d[i],d[flag]+cost[flag][i]);
        }
    }
    for(int i=0;i<v;i++)
        cout<<d[i]<<" ";
    cout<<endl;
}
int main()
{
    ios::sync_with_stdio(false);
    cin>>v>>e;
    for(int i=0;i<v;i++)
    {
        for(int j=0;j<v;j++)
            cost[i][j]=INF;
    }
    int a,b,va;
    for(int i=0;i<e;i++)
    {
        cin>>a>>b>>va;
        cost[a][b]=va;
    }
    solve(0);
    return 0;
}

原文地址:https://www.cnblogs.com/caijiaming/p/9381476.html

时间: 2024-10-18 19:48:29

Dijkstra算法(求一点到任意一点的最短距离)的相关文章

_DataStructure_C_Impl:Dijkstra算法求最短路径

// _DataStructure_C_Impl:Dijkstra #include<stdio.h> #include<stdlib.h> #include<string.h> typedef char VertexType[4]; typedef char InfoPtr; typedef int VRType; #define INFINITY 100000 //定义一个无限大的值 #define MaxSize 50 //最大顶点个数 typedef int P

Dijkstra算法求最短路径(java)(转)

原文链接:Dijkstra算法求最短路径(java) 任务描述:在一个无向图中,获取起始节点到所有其他节点的最短路径描述 Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止. Dijkstra一般的表述通常有两种方式,一种用永久和临时标号方式,一种是用OPEN, CLOSE表方式用OPEN,CLOSE表的方式,其采用的是贪心法的算法策略,大概过程如下:1.声明两个集合,open和close

Dijkstra算法求最短路径

摘自最短路径算法,如有任何侵权问题,请及时通知本人,本人将马上予以删除. 链接算法过程 /* 有向图的构建及最短路径求解(Dijkstra) */ #include <stdio.h> #include <stdlib.h> #define MAX_VERTEX_NUM 30 #define MAX_INT 1000 typedef int VrType; typedef char VtType; bool visted[MAX_VERTEX_NUM]; //搜索时的标记矩阵 ty

Dijkstra算法求单源最短路径

1.最短路径 在一个连通图中,从一个顶点到另一个顶点间可能存在多条路径,而每条路径的边数并不一定相同.如果是一个带权图,那么路径长度为路径上各边的权值的总和.两个顶点间路径长度最短的那条路径称为两个顶点间的最短路径,其路径长度称为最短路径长度. 最短路径在实际中有重要的应用价值.如用顶点表示城市,边表示两城市之间的道路,边上的权值表示两城市之间的距离.那么城市A到城市B连通的情况下,哪条路径距离最短呢,这样的问题可以归结为最短路径问题. 求最短路径常见的算法有Dijkstra算法和Floyd算法

Dijkstra算法求最短路径 C++实现

Dijstra算法代码借鉴: #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #define Inf 0x3f3f3f3f using namespace std; int map[1005][1005];//存储输入数组值 int vis[1005],dis[1005];//vis标记数组,dis最短路径 int n,m;//n个点,m条边 void Ini

JAVA实践Dijkstra算法求最短路径距离

前言 Dijkstra算法用于求指定顶点到其他顶点的最短距离,时间复杂度O(N^2),据说可以使用堆优化到O(log N),然而还不会. 其特点是(对我来说)非常容易求得路径,和对应的距离. 缺陷也是存在的,此算法不能处理负权边.即距离为负时,就挂了. 此文内容同样参考<啊哈,算法> 另外个人感觉代码可能有错,还望有心人指点. 功能实现 输入一个顶点 输出路径 输出与路径对应的距离 如果存在不可到达的顶点,则输出该顶点不可到达 中文版参考 对应的二维数组 {0, 1, 12, INF, INF

dijkstra算法求最短路

艾兹格·W·迪科斯彻 (Edsger Wybe Dijkstra,1930年5月11日~2002年8月6日)荷兰人. 计算机科学家,毕业就职于荷兰Leiden大学,早年钻研物理及数学,而后转为计算学.曾在1972年获得过素有计算机科学界的诺贝尔奖之称的图灵奖,之 后,他还获得过1974年 AFIPS Harry Goode Memorial Award.1989年ACM SIGCSE计算机科学教育教学杰出贡献奖.以及2002年ACM PODC最具影响力论文奖. 艾兹格·W·迪科斯彻(Edsger

Java实现Dijkstra算法求最短路径

任务描述:在一个无向图中,获取起始节点到所有其他节点的最短路径描述 Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止. Dijkstra一般的表述通常有两种方式,一种用永久和临时标号方式,一种是用OPEN, CLOSE表方式用OPEN,CLOSE表的方式,其采用的是贪心法的算法策略,大概过程如下:1.声明两个集合,open和close,open用于存储未遍历的节点,close用来存储已遍

Dijkstra算法——计算一个点到其他所有点的最短路径的算法

迪杰斯特拉算法百度百科定义:传送门 迪杰斯特拉算法用来计算一个点到其他所有点的最短路径,是一种时间复杂度相对比较优秀的算法 O(n2)(相对于Floyd算法来说) 是一种单源最短路径算法,但是它并不能处理负边权的情况 板子代码: #include<cstdio> #include<iostream> #include<cstdlib> #include<iomanip> #include<cmath> #include<cstring>