参考博客:http://www.wutianqi.com/?p=1890

#include <iostream>
using namespace std;
#define  max 1<<20  //无穷大
int pre[100];    //p[i]存放路径中i前面一个点
int dis[100];    //到远点的距离
int c[100][100]; //每个点间的距离

int dijkstra(int n, int v){  //v是源点,n是点的个数
     bool s[100] = {0};   //表示是否在原点集合中

for(int i = 1; i <= n; i++){ //初始化dis[],s[],pre[]
        dis[i] = c[i][v];
        s[i] = 0;
        if(dis[i] != max){
            pre[i] = v;
        }
        else
            pre[i] = 0;
    }
    dis[v] = 0;
    s[v] = 1;
    for(int i = 2; i <= n; i++){
        int temp = max, u = v;
        for(int j = 1; j <= n; j++){    //找到最小的直达源点的点
            if(!s[j] && temp > dis[j]){
                temp = dis[j];
                u = j;
            }
        }
//        cout << "u: " << u << endl;
        s[u] = 1; //表示将找的的点放入源点集合
        for(int j = 1; j <= n; j++){          //更新u的临边到远点的距离
            if(!s[j] && c[j][u] < max){
//                cout << "jJJ" << endl;
                if(dis[j] > c[j][u] + dis[u]){
                    dis[j] = c[j][u] + dis[u];
                    pre[j] = u;
//                    cout << "j:" << j << endl;
                }
            }
        }
    }
    return 1;
}

int luxian(int v, int u){  //查找点源点v到u点的距离
    int p;
    int count = 0, a[100] = {u};
    p = pre[u];
    while(p != v){
        a[++count] = p;
        p = pre[p];
    }
    a[++count] = v;
    cout << "count" << count << endl;
    for(int i = count; i >= 0; i--)
        cout << a[i] << " -> ";
}

int main(){
    ios::sync_with_stdio(false);
    int n, line, a, b, len;
    cin >> n >> line;
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= n; j++)
            c[i][j] = max;
    cout << max;
    for(int i = 1; i <= line; i++){
        cin >> a >> b >> len;
        if(len < c[a][b]){
            c[a][b] = len;
            c[b][a] = len;
        }
    }
    for(int i = 1; i <= n; i++)
        dis[i] = max;
        
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= n; j++)
            cout << c[i][j] << "      ";
        cout << endl;
    }
        
    dijkstra(n, 1);
    luxian(1, n);
    cout << endl;
    cout << "1到n的最小距离: " << dis[n] << endl;
    return 0;
}

9-最短路径(dijkstra)的更多相关文章

  1. 最短路径 dijkstra

    最短路径 dijkstra #include <stdio.h> #include <string.h> #include <limits.h> #define M ...

  2. 网络最短路径Dijkstra算法

    最近在学习算法,看到有人写过的这样一个算法,我决定摘抄过来作为我的学习笔记: <span style="font-size:18px;">/* * File: shor ...

  3. c/c++ 图的最短路径 Dijkstra(迪杰斯特拉)算法

    c/c++ 图的最短路径 Dijkstra(迪杰斯特拉)算法 图的最短路径的概念: 一位旅客要从城市A到城市B,他希望选择一条途中中转次数最少的路线.假设途中每一站都需要换车,则这个问题反映到图上就是 ...

  4. 单源最短路径Dijkstra算法,多源最短路径Floyd算法

    1.单源最短路径 (1)无权图的单源最短路径 /*无权单源最短路径*/ void UnWeighted(LGraph Graph, Vertex S) { std::queue<Vertex&g ...

  5. 最短路径——Dijkstra算法和Floyd算法

    Dijkstra算法概述 Dijkstra算法是由荷兰计算机科学家狄克斯特拉(Dijkstra)于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图(无 ...

  6. 最短路径-Dijkstra算法与Floyd算法

    一.最短路径 ①在非网图中,最短路径是指两顶点之间经历的边数最少的路径. AE:1    ADE:2   ADCE:3   ABCE:3 ②在网图中,最短路径是指两顶点之间经历的边上权值之和最短的路径 ...

  7. 数据结构实验之图论七:驴友计划 ( 最短路径 Dijkstra 算法 )

    数据结构实验之图论七:驴友计划 Time Limit: 1000 ms           Memory Limit: 65536 KiB Submit Statistic Discuss Probl ...

  8. 最短路径——Dijkstra算法以及二叉堆优化(含证明)

    一般最短路径算法习惯性的分为两种:单源最短路径算法和全顶点之间最短路径.前者是计算出从一个点出发,到达所有其余可到达顶点的距离.后者是计算出图中所有点之间的路径距离. 单源最短路径 Dijkstra算 ...

  9. 有向网络(带权的有向图)的最短路径Dijkstra算法

    什么是最短路径? 单源最短路径(所谓单源最短路径就是只指定一个顶点,最短路径是指其他顶点和这个顶点之间的路径的权值的最小值) 什么是最短路径问题? 给定一带权图,图中每条边的权值是非负的,代表着两顶点 ...

  10. 理解最短路径-Dijkstra算法

    最短路径—Dijkstra算法和Floyd算法 透彻理解迪杰斯特拉算法 Dijkstra算法的使用条件:图中不存在负权边. ---------------------------有待验证------- ...

随机推荐

  1. Bind2nd源码解析

    例:transform(coll1.begin(), coll1.end(), back_inserter(coll2), bind2nd(multiplies<int>(), 10)); ...

  2. ulimit限制打开的文件数量

    以限制打开文件数为例. ulimit -Hn 查看硬限制. ulimit -Sn 查看软限制. ulimit -n 查看两个中更小的限制(软限制始终比硬限制低, 所以查看的是软限制) 设定规则 1.软 ...

  3. 【Python编程:从入门到实践】chapter2 变量和简单数据类型

    2.1 运行2.2 变量 message = "hello" print(message) 2.2.1 变量的命名和使用 2.2.2 使用变量是避免命名错误2.3 字符串 “Hel ...

  4. Determining IP information for eth0...failed 错误解决

    问题描述:虚拟机使用wget命令上网,执行service network restart后出现如下错误Determining IP information for eth0...failed解决办法: ...

  5. css实现文本两行或多行文本溢出显示省略号

    word-break: break-all; text-overflow: ellipsis; display: -webkit-box; /** 对象作为伸缩盒子模型显示 **/ -webkit-b ...

  6. Visual Studio自动添加头部注释

    VS2013 自动添加头部注释 1.找到VS2013的安装目录 下文以安装目录 C:\Program Files (x86)\Microsoft Visual Studio 12.0 为例 2.修改C ...

  7. OpenACC数据管理语句

    ▶ 书中第4章,数据管理部分的代码和说明 ● 代码,关于 copy,copyin,copyout,create #include <stdio.h> #include <openac ...

  8. Gson进行json字符串和对象之间的转化

    Gson可以实现对象与json字符串之间的转化,以下是在Android中的示例代码. Gson主页:https://code.google.com/p/google-gson/ public clas ...

  9. 20. orcle中统计一个字符串中某个字符的长度

    例子1:统计一个字符串中“,”的个数: select lengthb(regexp_replace('[a,b,c,d,e,f]','[^,]',null))  as res from dual; 例 ...

  10. PLSQL developer常用技巧

    1.PL/SQL Developer记住登陆密码 在使用PL/SQL Developer时,为了工作方便希望PL/SQL Developer记住登录Oracle的用户名和密码: 设置方法:tools- ...