最短路径算法实现

最短路径算法

1、Dijkstra算法

目的是求解固定起点分别到其余各点的最短路径

步骤如下:

  1. 准备工作:构建二位矩阵edge,edge[i][j]存储i->j的权重,如果i==j则edge[i][j]=0,如果i和j不是直达的,则edge[i][j]=MAX_INT
  2. 构建数组dis[],其中dis[i]表示其实点start->i之间的权重,不断更新,得到最小的权重
  3. 选取离start最近的直达点,(注,非直达的点一定会经过中间的跳变点,间接到达,首先考虑的一定是经过离start最近的点进行跳变)
  4. 判断dis[i]与dis[离start最近的点index]+edge[离start最近的点index][i]的大小,更新dis[i]
  5. 重复3-4(注意标记,防止重复计算)
#include <iostream>

using namespace std;

const int max_int = ~(1<<31);
const int min_int = (1<<31);

int main(){
    int n,m,s;//n is the number of nodes, m is the number of edges and s is the start node.
    int t1,t2,t3;//t1 is the start node, t2 is the end node and t3 is the weight between t1 and t2
    cout<<"Please input the number of node(n), edges(m) and start node(s):"<<endl;
    cin>>n>>m>>s;
    int edge[n+1][n+1];//Store the edges for the n nodes
    int dis[n+1], is_visited[n+1];// dis[k] store the min distance between s and k,\
                                     is_visited store the status of the node(whether it is visited or not)

    //Init the edge[][] with the max_int
    for(int i=1; i<=n; i++){
        for(int j = 1; j <= n; j++)
            if(i==j) edge[i][j] = 0;
            else edge[i][j] = max_int;
    }

    //Input the Edge data
    cout<<"Please input the edge data: t1(start node), t2(end node), t3(weight)"<<endl;
    for(int i=1; i<=m; i++){
        cin>>t1>>t2>>t3;
        edge[t1][t2] = t3;
    }

    /*
     * Init the is_visited[] with 0
     * Init the dis[]
     */
    for(int i=1; i<=n; i++){
        is_visited[i] = 0;
        dis[i] = edge[s][i];
    }

    is_visited[s] = 1;

    //The Dijkstra algorithm
    for(int i=1; i<=n; i++){
        int u; // Store the min value index in dis[] which is not visited
        int min = max_int; // Store the min value in dis[] which is not visited
        for(int j=1; j<=n; j++){
            if(is_visited[j]==0 && dis[j]<min){
                min = dis[j];
                u = j;
            }
        }

        is_visited[u] = 1;
        for(int k=1; k<=n; k++){
            //第一层判断防止dis[u]+edge[u][k]越界
            if(edge[u][k] < max_int){
                if(is_visited[k]==0 && dis[k]>dis[u]+edge[u][k]){
                    dis[k] = dis[u] + edge[u][k];
                    cout<<u<<" "<<k<<" "<<dis[k]<<endl;
                }
            }
        }
    }

    // Print the result
    for(int i=1; i<=n; i++){
        cout<<"The min weight between "<<s<<" and "<<i<<" is: "<<dis[i]<<endl;
    }

}

2、Floyd算法

目的是求解任意两点的最短路径,核心思想是经过任意数量的节点进行中转,检查路径是否为最短

 for(k=1;k<=n;k++)//经过k进行中转
        for(i=1;i<=n;i++)
            for(j=1;j<=n;j++)
                if(e[i][j]>e[i][k]+e[k][j])
                     e[i][j]=e[i][k]+e[k][j];
时间: 2024-10-20 22:38:26

最短路径算法实现的相关文章

最短路径算法专题1----弗洛伊德

由于最短路径算法我认为比较重要,所以分成几个专题来慢慢细化去磨它,不能一口气吃个胖子嘛. 首先在说算法之前,先说清楚什么叫做最短路径. 题目一般会给你一张图,然后告诉你很多地方,然后告诉你各个地方之间的路程有多远,要你求出,两点间的最短距离,注意,题目给出的两点间的距离未必是最短的,可能通过第三个点转换之后达到更短.实际其实也是这样的,有时候两个地方并没有直线的道路只有曲线的绕路. 算法的思路: 1.用二维数组列出所有的距离,达到不了的用最大距离表示,如9999999 2.循环数组上面的每一个点

图论之最短路径算法

简介: 求最短路径算法中最具代表性的是Dijkstra算法. Dijkstra算法的思想是基于贪心策略的. 概述其过程是通过设置顶点集合S并不断地做贪心选择来扩充集合. 贪心选择的标准是每次都选择从源节点到该节点的路径长度最短. 难点: 网络上博客中大多数人写的最短路径算法大多都是只能寻找到最短的一条路径. 但是很多时候可能存在并列最短的路径,需要找出所有同时最短的路径. 在这里我给大家分享一个时间复杂度大概是O(n2)的算法,求并列最短路径算法. 求出一条最短路径的算法步骤如下: 假设G={V

最短路径算法

最短路径-Dijkstra算法和Floyd算法 1.Dijkstra算法 1.1.定义概览Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等.注意该算法要求图中不存在负权边. 问题描述:在无向图 G=(V,E) 中,假设每条边 E[i] 的长度为 w[i],找到由顶点

最短路径算法整理(二)

本文是最短路径算法整理的第二篇,想阅读第一篇的朋友能够点击下面链接: http://blog.csdn.net/hjd_love_zzt/article/details/26739593 这一篇博客继续以一些OJ上的题目为载体,整理一下最短路径算法.会陆续的更新... 1.HDU 2544 题目与分析:这道题抽象一下,还是:"求a到b的最短路径"..所须要的基本条件是:点数.边数.起点.终点 下面给出floyd.dijkstra.bellmanford三种最短路径算法关于这道题的解法:

最短路径算法学习总结

Dijkstra最短路径算法: dijkstra 算法的优点在于可以求出从一点到所有其他点的最短距离: input: 5 71 2 101 3 201 5 302 5 102 3 54 5 204 3 30 output: 0 10 15 40 20//这是求的在这颗树中,1到所有点的最短距离 1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 const int N=1100; 5 const int

无向图的最短路径算法JAVA实现(转)

一,问题描述 给出一个无向图,指定无向图中某个顶点作为源点.求出图中所有顶点到源点的最短路径. 无向图的最短路径其实是源点到该顶点的最少边的数目. 本文假设图的信息保存在文件中,通过读取文件来构造图.文件内容的格式参考这篇文章第一部分. 二,算法实现思路 无向图的最短路径实现相对于带权的有向图最短路径实现要简单得多. 源点的最短路径距离为0,从源点开始,采用广度优先的顺序,首先将与源点邻接的顶点的路径求出,然后再依次求解图中其他顶点的最短路径. 由于顶点的最短路径的求解顺序 是一个 广度优先的顺

最短路径算法-Dijkstra算法的应用之单词转换(词梯问题)

一,问题描述 在英文单词表中,有一些单词非常相似,它们可以通过只变换一个字符而得到另一个单词.比如:hive-->five:wine-->line:line-->nine:nine-->mine..... 那么,就存在这样一个问题:给定一个单词作为起始单词(相当于图的源点),给定另一个单词作为终点,求从起点单词经过的最少变换(每次变换只会变换一个字符),变成终点单词. 这个问题,其实就是最短路径问题. 由于最短路径问题中,求解源点到终点的最短路径与求解源点到图中所有顶点的最短路径复

几个最短路径算法Floyd、Dijkstra、Bellman-Ford、SPFA的比较(转)

几大最短路径算法比较 几个最短路径算法的比较:Floyd        求多源.无负权边(此处错误?应该可以有负权边)的最短路.用矩阵记录图.时效性较差,时间复杂度O(V^3).       Floyd-Warshall算法(Floyd-Warshall algorithm)是解决任意两点间的最短路径的一种算法,可以正确处理有向图或负权的最短路径问题. Floyd-Warshall算法的时间复杂度为O(N^3),空间复杂度为O(N^2). Floyd-Warshall的原理是动态规划:设Di,j

最短路径算法集锦

/* Name: 最短路径算法集锦 Copyright: Author: 巧若拙 Date: 12/11/14 15:32 Description: 列举了深度优先搜索的递归和非递归算法,Dijkstra最短路径算法, 基于Bellman-Fort最短路径算法的改进型广度优先搜索算法, Floyd-Warshall最短路径算法的原始版和变化版 本文是阅读<啊哈!算法>后的学习笔记,代码与教材中有些差异,若有错误请指正,谢谢! 测试数据: 5 7 0 3 2 0 4 9 4 2 1 4 1 3

(最短路径算法整理)dijkstra、floyd、bellman-ford、spfa算法模板的整理与介绍

这一篇博客以一些OJ上的题目为载体.整理一下最短路径算法.会陆续的更新... 一.多源最短路算法--floyd算法 floyd算法主要用于求随意两点间的最短路径.也成最短最短路径问题. 核心代码: /** *floyd算法 */ void floyd() { int i, j, k; for (k = 1; k <= n; ++k) {//遍历全部的中间点 for (i = 1; i <= n; ++i) {//遍历全部的起点 for (j = 1; j <= n; ++j) {//遍历