`
pleasetojava
  • 浏览: 730360 次
  • 性别: Icon_minigender_2
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

每对顶点间的最短路径算法时间复杂度改进C++实现

 
阅读更多

// 每对顶点间的最短路径.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include<iostream>
#define MAX 100
#define Infinity 65535
using namespace std;

//L2[i][j]存储L1[i][j]*Lij
int L1[MAX][MAX];
int L2[MAX][MAX];
//用来存储边的权值,即有向图的邻接矩阵
int w[MAX][MAX];

//初始化,把w[i][j]赋给L1[i][j]
void initialise(int n)
{
int i,j;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
L1[i][j] = w[i][j];
}
//求每一对顶点间暂时最短距离
void extend_shortest_paths(int n)
{
int i,j,k,l;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
L2[i][j] = Infinity;
for(k=1;k<=n;k++)
//改进
L2[i][j] = L2[i][j]<(L1[i][k]+L1[k][j])?L2[i][j]:(L1[i][k]+L1[k][j]);
}
}
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
L1[i][j] = L2[i][j];
}

//求所有对顶点之间的最短距离
void show_all_pairs_shortest_paths(int n)
{
initialise(n);
int m;
for(m=2;m<=n-1;m++)
extend_shortest_paths(n);
}
int _tmain(int argc, _TCHAR* argv[])
{
int cases;
cout<<"请输入案例的个数:"<<endl;
cin>>cases;
while(cases--)
{
cout<<"请输入顶点个数:"<<endl;
int n;
cin>>n;
cout<<"请输入邻接矩阵(n*n)(如果二点之间没有有向线段,输入65535):"<<endl;
int i,j;
//二点之间没有有向线段,输入65535
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
cin>>w[i][j];
}
show_all_pairs_shortest_paths(n);
cout<<"输出每一对顶点间的最短距离:"<<endl;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
cout<<"顶点"<<i<<"到顶点"<<j<<"的最短距离为:"<<L1[i][j]<<endl;
}
}
system("pause");
return 0;
}

-----------------------------------------------------程序测试--------------------------------------------------

请输入案例的个数:
1
请输入顶点个数:
5
请输入邻接矩阵(n*n)(如果二点之间没有有向线段,输入65535):
0 3 8 65535 -4
65535 0 65535 1 7
65535 4 0 65535 65535
2 65535 -5 0 65535
65535 65535 65535 6 0
输出每一对顶点间的最短距离:
顶点1到顶点1的最短距离为:0
顶点1到顶点2的最短距离为:1
顶点1到顶点3的最短距离为:-3
顶点1到顶点4的最短距离为:2
顶点1到顶点5的最短距离为:-4
顶点2到顶点1的最短距离为:3
顶点2到顶点2的最短距离为:0
顶点2到顶点3的最短距离为:-4
顶点2到顶点4的最短距离为:1
顶点2到顶点5的最短距离为:-1
顶点3到顶点1的最短距离为:7
顶点3到顶点2的最短距离为:4
顶点3到顶点3的最短距离为:0
顶点3到顶点4的最短距离为:5
顶点3到顶点5的最短距离为:3
顶点4到顶点1的最短距离为:2
顶点4到顶点2的最短距离为:-1
顶点4到顶点3的最短距离为:-5
顶点4到顶点4的最短距离为:0
顶点4到顶点5的最短距离为:-2
顶点5到顶点1的最短距离为:8
顶点5到顶点2的最短距离为:5
顶点5到顶点3的最短距离为:1
顶点5到顶点4的最短距离为:6
顶点5到顶点5的最短距离为:0
请按任意键继续. . .

分享到:
评论

相关推荐

    Floyd最短路径算法C++实现

    **Floyd最短路径算法详解** Floyd-Warshall算法,通常简称为Floyd算法,是一种在图中寻找所有顶点对之间最短路径的有效算法。由Robert W. Floyd于1962年提出,该算法的核心思想是通过动态规划逐步增加中间节点,以...

    单源最短路径--分支限界法

    该方法使用优先队列来存储顶点,优先队列中的每个元素是一个 HeapNode 对象,该对象包含了顶点的编号和从源到该顶点的最短路径长度。算法的主要步骤如下: 1. 初始化:将源顶点加入优先队列,并将所有其他顶点的...

    最短路径算法实现 k-shortest-paths

    7. 源码软件:在实际应用中,k-最短路径算法的实现通常涉及到编程,可能用C++, Java, Python等语言编写。源码软件应当包含数据结构(如邻接矩阵或邻接表)、算法实现以及可能的优化策略,例如使用优先队列(如二叉堆...

    最短路径算法—Dijkstra(迪杰斯特拉)算法分析与实现(CC++)

    在C/C++中,Dijkstra算法的实现通常涉及一个二维数组c表示图的边权重,以及一维数组dist和prev分别存储最短路径的长度和前驱节点。在上述代码中,可以看到算法的逻辑: - 第14行的Dijkstra函数接收图的节点数n,...

    数据结构。最短路径算法

    数据结构与最短路径算法是计算机科学中的核心概念,尤其在图论和算法设计中占有重要地位。在解决网络中的路径问题,如交通路线、通信网络优化或是游戏中的寻路算法时,最短路径算法起着关键作用。本文将深入探讨最短...

    最短路径算法导航(附C++代码)

    【最短路径算法导航(附C++代码)】 在计算机科学和图论中,寻找图中两点间的最短路径是一个常见的问题,特别是在网络路由、地理信息系统和资源分配等领域。本项目利用Floyd算法来解决这一问题,以实现校园内的导航...

    vc++实现最短路径算法

    在标题"vc++实现最短路径算法"中,我们关注的是从一个指定的起点(v0)出发,寻找到达图中所有其他顶点的最短路径。这一过程通常用于路由规划、网络优化和许多其他实际应用。 描述中提到的"逐步求解"是指算法会逐步...

    Dijkstra算法最短路径的C++实现与输出路径

    "Dijkstra算法最短路径的C++实现与输出路径" Dijkstra算法是解决单源最短路径问题的经典算法, 由荷兰计算机科学家Edsger W. Dijkstra在1956年提出。该算法可以解决从某个源点到其他所有顶点的最短路径问题。 ...

    Floyd算法,求有向图中各顶点之间的最短路径及其长度

    Floyd算法,全称为Floyd-Warshall算法,是一种用于解决图论问题的著名算法,主要用来寻找有向图或无向图中所有顶点之间的最短路径。它由美国计算机科学家Robert W. Floyd在1962年提出,因此得名。这个算法的核心思想...

    基于C++进行单源最短路径算法(SSSP)的探究【100012197】

    总之,基于C++的单源最短路径算法是图论中的重要工具,通过理解图的结构、选择合适的数据结构和算法,我们可以有效地解决实际问题。"delta-stepping"算法提供了一种平衡时间和空间复杂度的解决方案,对于教学和实际...

    利用Dijkstra算法来求解顶点之间最短路径

    2. 任务定义:对任意图,选择合适的数据结构表示图,在此基础上实现求解最短路径的 Dijkstra 算法。 二、概要设计和数据结构的选择 1. 程序中涉及到的结构体及子函数: * 结构体:struct vertex{ int num; int ...

    《数据结构课程设计》最短路径问题实验报告

    而弗洛伊德算法可以处理负权重的边,但其时间复杂度相对较高,适合解决所有顶点对间的最短路径问题。 6. **系统设计**: 系统概要设计包括图的建立、单源最短路径的求解和任意两点间最短路径的计算。详细设计部分...

    最短路径算法(东大)

    通过以上内容,我们可以理解最短路径算法的基本原理和C++实现策略。在实际应用中,理解这些算法的细节和优化技巧至关重要,因为它们直接影响着程序的效率和正确性。通过不断的练习和实践,你可以更好地掌握这些算法...

    求最短路径的算法实现_C++

    该算法的时间复杂度为O(V^3),其中V是图中的顶点数。Floyd-Warshall的基本步骤如下: ```cpp // Floyd-Warshall算法 void floydWarshall(Graph graph) { int V = graph.numVertices; vector&lt;vector&lt;int&gt;&gt; dist(V,...

    VC游戏编写中的求解最短路径算法源码

    4. Floyd-Warshall算法:用于求解所有顶点对间的最短路径,适合在游戏地图设计时一次性计算所有可能的路径,以备后续使用。 5. Bidirectional Search(双向搜索):同时从起点和终点开始搜索,当两个搜索路径相遇时...

    单源最短路径的分支限界算法_文档.doc

    分支限界算法是一种常用的解决单源最短路径问题的方法,本文档介绍了使用 C++ 实现的单源最短路径的分支限界算法。 1. 算法概述 单源最短路径的分支限界算法是一种基于优先队列的算法。该算法的基本思想是从源点...

    求单源最短路径(算法分析中)c++

    在实际应用中,单源最短路径算法不仅限于C++,也可以在其他编程语言中实现,如Java、Python等。无论使用哪种语言,理解算法背后的逻辑和数据结构是至关重要的,这将帮助你更有效地解决问题并进行代码实现。

    任意两个顶点之间的最短路径_Floyd算法_C语言

    Floyd算法,也称为Floyd-Warshall算法,是解决图论问题中的一个经典算法,主要用于求解所有顶点对之间的最短路径。它是由美国计算机科学家Robert Floyd在1962年提出的。这个算法的核心思想是通过动态规划的方式,...

    弗洛伊德算法 计算最短路径

    它由美国计算机科学家罗伯特·弗洛伊德在1962年提出,主要用来找到图中所有顶点对间的最短路径。这个算法适用于加权有向图和无向图,特别是当图中含有负权边时,而Dijkstra算法在这种情况下则无法保证正确性。 算法...

Global site tag (gtag.js) - Google Analytics