// 每对顶点间的最短距离Floyd_Warshall算法.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include<iostream>
#define MAX 100
#define Infinity 65535
#define NIL 65535
using namespace std;
//d
int d1[MAX][MAX];
int d2[MAX][MAX];
//用来存储边的权值,即有向图的邻接矩阵
int w[MAX][MAX];
//
int parent1[MAX][MAX];
int parent2[MAX][MAX];
//初始化,把w[i][j]赋给d[i][j]
void initialise(int n)
{
int i,j;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
d1[i][j] = w[i][j];
}
//求所有对顶点之间的最短距离
void Floyd_Warshall(int n)
{
initialise(n);
int i,j,k;
for(k=1;k<=n;k++)
{
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
if(d1[i][j]<=(d1[i][k]+d1[k][j]))
{
d2[i][j] = d1[i][j];
parent2[i][j] = parent1[i][j];
}
else
{
d2[i][j] = (d1[i][k]+d1[k][j]);
parent2[i][j] = parent1[k][j];
}
}
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
d1[i][j] = d2[i][j];
parent1[i][j] = parent2[i][j];
}
}
}
void print_i_to_j(int i,int j)
{
int p = parent1[i][j];
if(p==NIL)
{
cout<<"顶点"<<j<<" ";
return;
}
else
{
print_i_to_j(i,p);
cout<<"顶点"<<j<<" ";
}
}
void print(int n)
{
int i,j;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
cout<<parent1[i][j]<<" ";
cout<<endl;
}
}
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];
if(w[i][j]==0||w[i][j]==65535)
parent1[i][j] = NIL;
else
parent1[i][j] = i;
}
Floyd_Warshall(n);
cout<<"输出每一对顶点间的最短距离:"<<endl;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
cout<<"顶点"<<i<<"到顶点"<<j<<"的最短距离为:"<<d1[i][j]<<endl;
cout<<"顶点"<<i<<"到顶点"<<j<<"的最短路径为:"<<endl;
print_i_to_j(i,j);
cout<<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到顶点1的最短路径为:
顶点1
顶点1到顶点2的最短距离为:1
顶点1到顶点2的最短路径为:
顶点1 顶点5 顶点4 顶点3 顶点2
顶点1到顶点3的最短距离为:-3
顶点1到顶点3的最短路径为:
顶点1 顶点5 顶点4 顶点3
顶点1到顶点4的最短距离为:2
顶点1到顶点4的最短路径为:
顶点1 顶点5 顶点4
顶点1到顶点5的最短距离为:-4
顶点1到顶点5的最短路径为:
顶点1 顶点5
顶点2到顶点1的最短距离为:3
顶点2到顶点1的最短路径为:
顶点2 顶点4 顶点1
顶点2到顶点2的最短距离为:0
顶点2到顶点2的最短路径为:
顶点2
顶点2到顶点3的最短距离为:-4
顶点2到顶点3的最短路径为:
顶点2 顶点4 顶点3
顶点2到顶点4的最短距离为:1
顶点2到顶点4的最短路径为:
顶点2 顶点4
顶点2到顶点5的最短距离为:-1
顶点2到顶点5的最短路径为:
顶点2 顶点4 顶点1 顶点5
顶点3到顶点1的最短距离为:7
顶点3到顶点1的最短路径为:
顶点3 顶点2 顶点4 顶点1
顶点3到顶点2的最短距离为:4
顶点3到顶点2的最短路径为:
顶点3 顶点2
顶点3到顶点3的最短距离为:0
顶点3到顶点3的最短路径为:
顶点3
顶点3到顶点4的最短距离为:5
顶点3到顶点4的最短路径为:
顶点3 顶点2 顶点4
顶点3到顶点5的最短距离为:3
顶点3到顶点5的最短路径为:
顶点3 顶点2 顶点4 顶点1 顶点5
顶点4到顶点1的最短距离为:2
顶点4到顶点1的最短路径为:
顶点4 顶点1
顶点4到顶点2的最短距离为:-1
顶点4到顶点2的最短路径为:
顶点4 顶点3 顶点2
顶点4到顶点3的最短距离为:-5
顶点4到顶点3的最短路径为:
顶点4 顶点3
顶点4到顶点4的最短距离为:0
顶点4到顶点4的最短路径为:
顶点4
顶点4到顶点5的最短距离为:-2
顶点4到顶点5的最短路径为:
顶点4 顶点1 顶点5
顶点5到顶点1的最短距离为:8
顶点5到顶点1的最短路径为:
顶点5 顶点4 顶点1
顶点5到顶点2的最短距离为:5
顶点5到顶点2的最短路径为:
顶点5 顶点4 顶点3 顶点2
顶点5到顶点3的最短距离为:1
顶点5到顶点3的最短路径为:
顶点5 顶点4 顶点3
顶点5到顶点4的最短距离为:6
顶点5到顶点4的最短路径为:
顶点5 顶点4
顶点5到顶点5的最短距离为:0
顶点5到顶点5的最短路径为:
顶点5
请按任意键继续. . .
分享到:
相关推荐
综上所述,"基于C++实现的每对结点之间的最短路径(Floyd-Warshall算法)"源码打包提供了实现图论中最基本的问题之一——查找所有顶点对的最短路径的工具。这个算法在交通规划、网络路由等领域有着广泛的应用,理解并...
Floyd算法,也称为Floyd-Warshall算法,是解决图论问题中的一个经典算法,主要用于求解所有顶点对之间的最短路径。它是由美国计算机科学家Robert Floyd在1962年提出的。这个算法的核心思想是通过动态规划的方式,...
Floyd-Warshall算法,通常简称为Floyd算法,是一种在图中寻找所有顶点对之间最短路径的有效算法。由Robert W. Floyd于1962年提出,该算法的核心思想是通过动态规划逐步增加中间节点,以检查是否存在更短的路径。在...
- 对于大规模图,可以考虑使用贪心算法的变种,如Floyd-Warshall或Johnson's algorithm,它们能处理所有顶点对的最短路径。 Dijkstra算法是图论中基础且重要的算法之一,理解并掌握其原理和实现对于解决实际问题...
**Floyd-Warshall算法详解...总的来说,Floyd-Warshall算法是解决图论中寻找最短路径问题的重要工具,尤其适用于需要计算所有顶点对最短路径的情况。在编程实践中,理解并正确实现这个算法是提升图算法分析能力的关键。
在C++编程语言中,`Floyd.cpp`和`Warshall.cpp`两个文件分别实现了这两种算法。通常,代码会包含以下步骤: - 初始化邻接矩阵,根据输入数据填充矩阵,表示图的边和权重。 - 对于华罗庚算法,使用循环n次,每次循环...
在C++中,我们可以使用多种算法来解决这个问题,其中最著名的包括Dijkstra算法和Floyd-Warshall算法。Dijkstra算法适用于单源最短路径问题,而Floyd-Warshall则可以处理所有对之间最短路径的问题。 1. **Dijkstra...
Floyd算法,也被称为Floyd-Warshall算法,是一种用于解决多源最短路径问题的图算法。在图论和计算机科学中,它能够找出所有顶点对之间的最短路径。这个算法的核心思想是通过逐步考虑所有可能的中间节点来更新路径...
以上C++代码展示了Dijkstra算法和Floyd-Warshall算法的基本实现。在实际应用中,可能需要对图数据结构进行优化,如使用邻接表代替邻接矩阵,以节省空间。同时,根据具体问题,可以考虑使用Bellman-Ford算法处理负权...
源代码文件“两点之间的最短路径(Floyd算法)”很可能包含一个C++、Python或其他编程语言实现的Floyd-Warshall算法。代码可能包括以下几个部分: 1. 初始化二维数组,存储图中所有顶点对的距离。 2. 定义Floyd-...
在C++中实现Warshall算法,通常需要一个二维数组来表示图的邻接矩阵,其中的元素表示两个顶点之间是否存在边以及边的权重。初始状态下,邻接矩阵可以直接根据图的信息初始化。算法的主体部分包含三层嵌套循环,分别...
Floyd算法,全称为Floyd-Warshall算法,是一种用于解决图论问题的著名算法,主要用来寻找有向图或无向图中所有顶点之间的最短路径。它由美国计算机科学家Robert W. Floyd在1962年提出,因此得名。这个算法的核心思想...
接着,Floyd-Warshall算法是由美国计算机科学家罗伯特·弗洛伊德提出的,用于解决所有对最短路径的问题。它基于动态规划的思想,通过逐步增加中间顶点的方式尝试找到更短的路径。在每一步迭代中,算法检查所有可能的...
Floyd-Warshall算法是一种用于解决图中所有顶点对之间的最短路径问题的动态规划方法。它由美国计算机科学家Robert W. Floyd在1962年提出,因此得名。这个算法的核心思想是通过迭代的方式逐步更新所有可能的路径,...
Floyd-Warshall算法,通常称为Floyd算法,是图论中的一个著名算法,用于解决多源最短路径问题。这个算法由Robert Floyd在1962年提出,其核心思想是通过迭代的方式逐步完善最短路径信息,能够找出图中所有顶点之间的...
Floyd-Warshall算法是一种用于求解所有顶点对之间的最短路径的动态规划方法。它通过迭代的方式,逐步更新图中每个节点对之间可能的最短路径。算法的基本思想是检查是否存在一条经过中间节点的更短路径,如果有,就...
综上所述,这个程序提供了一个友好的图形界面,让用户能够方便地输入图的数据,并通过Floyd-Warshall算法计算出所有顶点间的最短路径。开发过程中,需要掌握MFC的窗口和控件编程,以及Floyd-Warshall算法的实现,...
Warshall算法是由美国计算机科学家Floyd于1962年提出的,因此也被称为Floyd-Warshall算法。该算法主要用于解决所有顶点对之间是否存在路径的问题,即计算图的传递闭包。传递闭包是指在有向图中,如果存在一条从顶点i...
在给出的文件中,"Floyd.cpp"可能是实现Floyd算法的C++代码,"input.txt"可能包含输入的图数据,如顶点数量、边和它们的权重,而"output.txt"则可能记录了算法运行后的输出结果,即所有顶点对的最短路径长度。...
Floyd-Warshall算法,由罗伯特·弗洛伊德和劳伦斯·沃什于1962年独立提出,是一种解决所有对之间最短路径问题的动态规划算法。该算法通过迭代方式,检查每一对顶点之间是否存在更短的路径。在每个迭代过程中,算法会...