第六章 最短路径——有向图(Floyd-Warshall、Dijkstra、Bellman-Ford)

一、Floyd-Warshall——加入点(多源最短路径,核心算法只有五行)

城市之间的最短路径

输入:

4 8

1 2 2

1 3 6

1 4 4

2 3 3

3 1 7

3 4 1

4 1 5

4 3 12

输出:

0 2 5 4

9 0 3 4

6 8 0 1

5 7 10 0

 1 #include <stdio.h>
 2 #define Max 99999
 3 int main()
 4 {
 5     int map[10][10];
 6     int n, m, x, y, t;
 7     int i, j, k;
 8     scanf("%d%d",&n,&m);
 9     for (i = 1;i <= n;i++)
10     {
11         for (j = 1;j <= n;j++)
12         {
13             if (i == j)
14                 map[i][j] = 0;
15             else
16                 map[i][j] = Max;
17         }
18     }
19     for (i = 1;i <= m;i++)
20     {
21         scanf("%d%d%d",&x,&y,&t);
22         map[x][y] = t;
23     }
24     for (k = 1;k <= n;k++)
25     {
26         for (i = 1;i <= n;i++)
27         {
28             for (j = 1;j <= n;j++)
29             {
30                 if (map[i][k] < Max&&map[k][j]<Max&&map[i][j]>map[i][k] + map[k][j])
31                 {
32                     map[i][j] = map[i][k] + map[k][j];
33                 }
34             }
35         }
36     }
37     for (i = 1;i <= n;i++)
38     {
39         for (j = 1;j <= n;j++)
40             printf("%d ",map[i][j]);
41         printf("\n");
42     }
43     return 0;
44 }

二、Dijkstra——加入边(单源最短路径)

输入:第一行n(顶点个数,编号从1开始),m(边的条数);接下来m行,每行3个数x,y,z,表示顶点x到y边的权值为z

6 9

1 2 1

1 3 12

2 3 9

2 4 3

3 5 5

4 3 4

4 5 13

4 6 15

5 6 4

输出:1号顶点到其余各个顶点(1,2,3,4,5,6)的最短距离

0 1 8 4 13 17

使用二位数组存储边

 1 #include <stdio.h>
 2 #define Max 99999
 3 int main()
 4 {
 5     int map[10][10],dis[10],book[10];
 6     int n, m, x, y, t;
 7     int i, j, k;
 8     int min,mini;
 9     scanf("%d%d",&n,&m);
10     for (i = 1;i <= n;i++)
11     {
12         for (j = 1;j <= n;j++)
13         {
14             if (i == j)
15                 map[i][j] = 0;
16             else
17                 map[i][j] = Max;
18         }
19     }
20     for (i = 1;i <= m;i++)
21     {
22         scanf("%d%d%d",&x,&y,&t);
23         map[x][y] = t;
24     }
25     for (i = 1;i <= n;i++)
26         dis[i] = map[1][i];
27     for (i = 1;i <= n;i++)
28         book[i] = 0;
29     book[1] = 1;
30     for (i = 1;i <n;i++)
31     {
32         min = Max;
33         for (j = 1;j <= n;j++)
34         {
35             if (book[j] == 0 && min > dis[j])
36             {
37                 min = dis[j];
38                 mini = j;
39             }
40         }
41         book[mini] = 1;
42         for (j = 1;j <= n;j++)
43         {
44             if (map[mini][j] < Max)
45             {
46                 if (dis[j] > dis[mini] + map[mini][j])
47                 {
48                     dis[j] = dis[mini] + map[mini][j];
49                 }
50             }
51         }
52     }
53     for (i = 1;i <= n;i++)
54     {
55         printf("%d ",dis[i]);
56     }
57     printf("\n");
58     return 0;
59 }

使用邻接表存储边

时间: 2024-10-11 22:23:11

第六章 最短路径——有向图(Floyd-Warshall、Dijkstra、Bellman-Ford)的相关文章

几个最短路径算法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

《啊哈!算法》第6章最短路径

第一节 Floyd-Warshall算法 本算法可以求任意两个点之间的最短路径,又称“多源最短路径”,其时间复杂度为O(n^3) 其核心部分只有下面几行,注意加法的溢出处理 //floyd最短路径算法的核心部分 for(int k = 0; k < n; ++ k){ for(int i = 0 ; i < n ; ++ i){ for(int j = 0 ; j < n ; ++ j){ if(grid[i][k]!=INT_MAX && grid[k][j]!=INT

最短路径问题---Floyd算法详解

前言 Genius only means hard-working all one's life. Name:Willam Time:2017/3/8 1.最短路径问题介绍 问题解释: 从图中的某个顶点出发到达另外一个顶点的所经过的边的权重和最小的一条路径,称为最短路径 解决问题的算法: 迪杰斯特拉算法(Dijkstra算法) 弗洛伊德算法(Floyd算法) SPFA算法 之前已经对Dijkstra算法做了介绍(不懂的可以看这篇博客:Dijkstra算法详解),所以这篇博客打算对Floyd算法做

九度 1447 最短路径 (Floyd算法和 Dijstra算法)

题目: 给出点的个数N.边的个数M(N<=100,M<=10000),以及M条边(每条边有3个整数A,B,C(1<=A,B<=N,1<=C<=1000),表A到B点的边权值为C).求点1到点N的最短路径长.N=M=0表示输入结束. Floyd算法: 1 #include <iostream> 2 #include <stdio.h> 3 #include <cstring> 4 using namespace std; 5 #defi

多源最短路径算法—Floyd算法

前言 在图论中,在寻路最短路径中除了Dijkstra算法以外,还有Floyd算法也是非常经典,然而两种算法还是有区别的,Floyd主要计算多源最短路径. 在单源正权值最短路径,我们会用Dijkstra算法来求最短路径,并且算法的思想很简单--贪心算法:每次确定最短路径的一个点然后维护(更新)这个点周围点的距离加入预选队列,等待下一次的抛出确定.但是虽然思想很简单,实现起来是非常复杂的,我们需要邻接矩阵(表)储存长度,需要优先队列(或者每次都比较)维护一个预选点的集合.还要用一个boolean数组

数据库系统实现 第六章 查询执行

第六章 查询执行 查询执行也就是操作数据库的算法 一次查询的过程: 查询-->查询编译(第七章)-->查询执行(第六章)-->数据 查询编译预览 查询编译可以分为三个步骤: a)分析:构造分析树,用来表达查询和它的结构 b)查询重写,分析树被转化为初始查询计划,通常是代数表达式,之后初始的查询计划会被优化为一个时间更小的计划 c)物理计划生成,将查询计划转化成物理的计划, 为了选择更好的查询计划,需要判断 1)查询哪一个代数的等价形式是最有效的 2)对选中形式的每一个操作,所使用的算法选

hdu1874 畅通project续 最短路 floyd或dijkstra或spfa

Problem Description 某省自从实行了非常多年的畅通project计划后.最终修建了非常多路.只是路多了也不好,每次要从一个城镇到还有一个城镇时,都有很多种道路方案能够选择.而某些方案要比还有一些方案行走的距离要短非常多.这让行人非常困扰. 如今,已知起点和终点.请你计算出要从起点到终点,最短须要行走多少距离. Input 本题目包括多组数据,请处理到文件结束. 每组数据第一行包括两个正整数N和M(0< N<200,0 < M<1000),分别代表现有城镇的数目和已

第六章:异常机制

第六章:异常机制 异常的定义 异常:在程序运行过程中出现的意外事件,导致程序中断执行. 异常处理 try...catch 语法:try{ //可能出现异常的代码}catch(异常类型 异常对象名){ //处理异常的代码:}执行过程:当try中的代码异常发生时抛出一个异常对象,该异常对象与catch中异常类型进行匹配,匹配成功进入catch块,否则不执行catch中代码(相当于异常未被处理).程序只有当异常处理成功后才能继续执行. try...catch...catch 语法:try{ //可能出

2017上半年软考 第六章 重要知识点

第六章 项目整体管理 []项目整体管理概述 [][]项目整体管理的含义.作用和过程 项目整体管理6个过程?p264 项目整体管理包括什么? 项目管理的核心是什么? 项目整体管理涉及哪几个方面?p265 [][]项目经理是整合者 项目经理作为整合者要做什么?p265 [][]整体管理的地位 []项目整体管理实现过程 [][]制定项目章程概述 项目章程的意义是什么? 项目章程包括什么? [][]制定项目章程 项目章程的作用? 项目章程的输入? 制定项目章程的工具和技术?p267 项目章程的输出?p2