// 每对顶点间的最短路径.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include<iostream>
#define MAX 100
#define Infinity 65535
using namespace std;
//
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]+w[k][j])?L2[i][j]:(L1[i][k]+w[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
请按任意键继续. . .
分享到:
相关推荐
Dijkstra算法适用于单源最短路径问题,而Floyd-Warshall则可以处理所有对之间最短路径的问题。 1. **Dijkstra算法**: Dijkstra算法是一种贪心算法,它从源节点开始,逐步扩展最短路径树,直到到达目标节点。每个...
本篇文章将详述如何使用C++编程语言实现一个算法来解决“校园最短路径”问题。我们将探讨图的表示方法、最短路径算法,以及如何在实际场景中应用这些概念。 首先,我们需要理解“图”的概念。图是由顶点(vertices...
Floyd-Warshall算法,通常简称为Floyd算法,是一种在图中寻找所有顶点对之间最短路径的有效算法。由Robert W. Floyd于1962年提出,该算法的核心思想是通过动态规划逐步增加中间节点,以检查是否存在更短的路径。在...
### Dijkstra算法求最短路径的C/C++程序解析 #### Dijkstra算法简介 Dijkstra算法是一种用于查找图中两点间最短路径的算法。它适用于有向图和无向图,但要求图中的所有边权重均为非负值。该算法通过逐步扩展一个...
在本实验中,我们使用C++语言实现了最短路径算法。实验的主要目的是熟悉图的存储结构和掌握最短路径算法。 实验程序中,我们首先定义了一个结构体MGraph,用于存储图的信息。然后,我们定义了两个函数CreateArray和...
2. 任务定义:对任意图,选择合适的数据结构表示图,在此基础上实现求解最短路径的 Dijkstra 算法。 二、概要设计和数据结构的选择 1. 程序中涉及到的结构体及子函数: * 结构体:struct vertex{ int num; int ...
Floyd算法的目的是找到从每个顶点到其他所有顶点的最短路径。在执行过程中,算法会维护一个二维数组,该数组的元素表示从一个顶点到另一个顶点的最短路径。初始时,数组的对角线元素为0(表示顶点到自身的距离为0)...
1. 问题描述:求网(带权有向图)中从一个顶点到其余各顶点间的最短路径。 2. 实验原理:贪心算法原理。 3. 实验内容:使用贪心算法解决单源最短路径问题,并通过本例熟悉贪心算法在程序设计中的应用方法。 4. 实验...
【单源点最短路径问题】是指在图论中,给定一个有向图G=(V,E),其中V是顶点集合,E是边集合,每个边e上有权重c(e),我们想要找到从一个特定顶点V0出发到图中其他所有顶点的最短路径。这个问题通常出现在网络优化、...
单源最短路径问题是从一个指定的起点到图中所有其他顶点的最短路径问题,这个问题在图论和计算机科学中有广泛的应用,例如网络路由优化、物流配送路线规划等。 分支限界法通常包括以下几个关键组件: 1. **搜索...
图可以表示节点(顶点)和它们之间的关系(边),这对于寻找两点间的最短路径至关重要。 3. **最短路径算法**:在图论中,最短路径问题寻找的是两个节点间经过最少边的路径。常见的算法有Dijkstra算法和Floyd-...
Dijkstra 算法是一种用于寻找图中两点间最短路径的经典算法。该算法由荷兰计算机科学家 Edsger W. Dijkstra 在 1956 年提出,并于 1959 年发表。它主要用于解决带权有向无环图中的单源最短路径问题。也就是说,对于...
加权图中顶点间最短路径的算法,使用C++实现Floyd算法,对正在学习算法的同学应该挺有帮助的
//*PROGRAM :最短路径 * //*CONTENT :弗洛依德算法 * //* * * * * * * * * * * * * * * * * * * * * * * * #include #include #include #include #include #define INFINITY 10000 //定义权值的最大值 #define...
C++实现Bellman-Ford算法,主要是一个松弛函数,遍历所有边,检查是否可以通过当前边缩短某个顶点的最短路径。在V-1次迭代后,如果仍存在边可以被松弛,说明图中存在负权环。 总结来说,求解最短路径问题有多种算法...
该方法使用优先队列来存储顶点,优先队列中的每个元素是一个 HeapNode 对象,该对象包含了顶点的编号和从源到该顶点的最短路径长度。算法的主要步骤如下: 1. 初始化:将源顶点加入优先队列,并将所有其他顶点的...
在C/C++中,Dijkstra算法的实现通常涉及一个二维数组c表示图的边权重,以及一维数组dist和prev分别存储最短路径的长度和前驱节点。在上述代码中,可以看到算法的逻辑: - 第14行的Dijkstra函数接收图的节点数n,...
2. 动态规划迭代:对每一个中间节点k(从1到n),检查所有顶点对(i, j),判断是否可以通过中间节点k使得i到j的路径变得更短。如果D[i][k] + D[k][j] [i][j],则更新D[i][j] = D[i][k] + D[k][j]。 3. 迭代结束后,...
C++课程设计最短路径,包括:单源最短路径、单目标最短路径、单顶点对间最短路径、所有顶点对间最短路径
本文将详细讲解如何使用C++实现图的最短路径算法,特别是Dijkstra(迪杰斯特拉)算法。首先,我们来看一下程序的核心部分。 Dijkstra算法是一种解决单源最短路径问题的算法,它能够找到从一个指定顶点(源点)到图...