单源最短路——Dijkstara算法

  算法基本思想:每次找到离源点最近的一个顶点,然后以该顶点为中心进行扩展,最终得到源点到其余所有点的最短路径。

  1、将所有的顶点分为两个部分:已知最短路程的顶点集合P和未知最短路径的顶点集合Q

  2、设置源点s到自己的最短路径为0,若存在有源点能够直接到达的顶点i则吧dis[i]设置为e[s][i]。同时把所有其它不能直接到达的顶点的最短路径设置为∞

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

  4、重复第三步,直到集合Q为空,算法结束。最终dis数组中的值就是源点到所有顶点的最短路径。

//dijketra算法
int main()
{
    int e[10][10];
    int book[10];
    int dis[10];
    int i, j, n, m, t1, t2, t3, u, v, min;
    int inf = 99999999;//用inf存储一个我们认为的正无穷值

    //读入n和m;n表示定点个数,m表示边的条数
    scanf("%d%d",&n,&m);

    //初始化e矩阵
    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数组初始化,book数组用来记录当前点是否被访问,访问1 else0
            for (i = 1; i <= n; i++)
                book[i] = 0;
            book[1] = 1;//一号顶点标记

    //核心算法
            for (i = 1; i <= n - 1; i++)
            {
                //找到离一号顶点最近的顶点
                min = inf;//将最小值复制为无穷
                for (j = 1; j <= n; j++)
                {
                    //如果当前顶点没有被访问,并且当前dis数组中的值小于最小值
                    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)
                    {
                        //遍历u打头的e数组
                        if (dis[v] > dis[u] + e[u][v])
                            dis[v] = dis[u] + e[u][v];//获得最短路径
                    }
                }
            }
            //输出结果
            for (i = 1; i <= n; i++)
            {
                printf("%d\t",dis[i]);
            }
            getchar(); getchar();
    return 0;
}
时间: 2024-10-27 00:03:16

单源最短路——Dijkstara算法的相关文章

单源最短路 Bellman-Ford算法

单源最短路问题是固定一个起点s,求它到所有点的最短路的问题. Bellman-Ford算法可以用于边权为负的情况而不像Dijkstra只适用于边权为正的情况(有负圈返回错误),但是其效率比较低. 记从起点s出发到顶点i的最短距离为的d[i] 那么 d[i] = min(d[j]+(j->i)|其中j->i属于E) 如果给定的图是DAG 那么可以用拓扑序给顶点编号,并利用这一条递推公式计算出d(DP). 如果图中有圈,就无法依赖这样的顺序进行计算.这种情况初始d[s]=0 d[i]=INF 再不

图论-单源最短路-SPFA算法

有关概念: 最短路问题:若在图中的每一条边都有对应的权值,求从一点到另一点之间权值和最小的路径 SPFA算法的功能是求固定起点到图中其余各点的的最短路(单源最短路径) 约定:图中不存在负权环,用邻接表存储有向图,di存放从起点到结点i的最短路,q为队列,保存待处理节点 思路: 首先指定起点入队,取当前队头结点u,沿每一条与u相连的边向外扩展,对该边所指向的结点v松弛(比较当前dv与当前du加此边长,更新最短路值dv,以及最短路径prev)如果v不在队列中且更新了最短路值,v进队,直至队列中没有元

单源最短路Dijkstra算法——matlab实现

迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径. 它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止. 基本思想 通过Dijkstra计算图G中的最短路径时,需要指定起点s(即从顶点s开始计算). 此外,引进两个集合S和U.S的作用是记录已求出最短路径的顶点(以及相应的最短路径长度),而U则是记录还未求出最短路径的顶点(以及该顶点到起点s的距离). 初始时,S中只有起点s:U中是除s之外的顶点,并且U中顶点的路径是"起点s

单源最短路Dijstra算法

Dijstra算法是寻找从某一顶点i出发到大其他顶点的最短路径.Distra算法的思想与Prim算法很像,它收录顶点的规则是按照路径长度递增的顺序收录的.设v0是源顶点,我们要寻找从v0出发到其他任意一点的最短路径.设已经求解的顶点(已经找到从v0出发到达该顶点最短路径的顶点)组成的集合是S={v0,v1,...vk};在收录下一个顶点v的时候要么是(v0,v),要么是(v0,vj,v);如果是后者,则一定有vj∈S,这一点很容易用反正法证明.Dijstra算法的时间复杂度是O(V^2),若是稀

[hiho 23]单源最短路-Dijstra算法

题目描述 维护一个集合,集合中的元素与点u的最短距离已经确定,求出集合内元素所能到达的点到点u的距离,取最短的距离对应的点加入集合直到集合包含点v. 每次更新距离只与新加入集合的点有关. #include <stdio.h> #include <string.h> #include <algorithm> #define N 1005 unsigned w[N][N]; int main(){ memset(w, -1, sizeof(w)); int n, m, u,

单源最短路-dijkstra算法(未优化)

1 bool used[maxn]; 2 int g[maxn][maxn]; // 边未联系的填充为INF 3 int d[maxn]; 4 void dijkstra(int s){ 5 memset(g,false,sizeof(g)); 6 memset(d,INF,sizeof(d)); 7 d[s] = 0; 8 while(1){ 9 int v = -1; 10 for(int u = 0; u<v; u++){ 11 if(!used[u] && (v == -1|

Dijkstra算法 --- 单源最短路

Dijkstra算法适用于边权值为正的情况,可用于计算正权图上的单元最短路. 其伪代码如下: 设d[v0] = 0, 其他d[i] = INF 循环n次{ 在所有未标号的结点中,选取d值最小的结点x 给结点x加上永久标号 对于从x出发的所有边,执行松弛操作. } //松弛操作的伪代码如下: RELAX(u,v,w) if(u.d + w(u,v) < v.d){ v.d = w.d + w(u,v); pre[v] = u; } Dijkstra算法代码: /* Dijkstra 单源最短路算法

【裸单源最短路:Dijkstra算法两种版本】hdu 1874 畅通工程续

Source : hdu 1874 畅通工程续 http://acm.hdu.edu.cn/showproblem.php?pid=1874 Problem Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多.这让行人很困扰. 现在,已知起点和终点,请你计算出要从起点到终点,最短需要行走多少距离. Input 本题目包含多组数据,请处理到文件结束.

再看最短路算法 1 —— 单源最短路

学了多年的算法,最短路问题相当之常见———— 好久没写过最短路的问题了,直到昨天闲的无聊来了一题——BZOJ3402(HansBug:额才发现我弱到只能刷水的地步了TT) 一看这不是明显的单源最短路么呵呵...于是直接上来来了个dijkstra,而且用的是邻接表存储图—— Submit之后,结果却是—— 我立刻被雷到了QAQ...于是立刻改写spfa,结果—— 4000ms+(估计还不止)和192ms究竟是怎样的差距啊QAQ,本人虽然早都听说过spfa的强大性,但是未曾想过差距会如此可怕,于是H