我正在尝试实施Floyd-Warshall Algorithm . 要做到这一点,它需要我设置加权图的 adjacency matrix
. 我该怎么做呢?我知道这些值,并附上了加权图的图片 . 我试图寻找一些在线的例子,但我似乎找不到任何东西 . 我理解Floyd-Warshall算法我只是需要帮助才能设置它,所以我能够实现它 . 这是我之前构建的一个,但我不必使用特定的值 .
Code:
public static void buildAdjMatrix()
{
for (int i = 0; i < 100; i++)
{
for (int j = 0; j < 100; j++)
{
if (directionAllowed(i, j) == true)
{
adjMatrix[i, j] = 1;
}
else
{
adjMatrix[i, j] = 50;
}
}
}
}
以下是具体的图表:
这是我需要创建的矩阵的图片..抱歉可怕的质量......
1 回答
所以,你似乎不熟悉Graphs,看看维基百科 . 还浏览一些图像,它更容易理解 .
一点概念
您的照片可以表示为
Graph
. 通常,图形使用2种基本类型的元素实现,Nodes
和Links
(有时称为Arcs
) .一个
Node
表示你图片中的字母,它们将是A,B,C等 . 一个Arc
或Link
,是连接两个节点的线,如果看看H到L之间的连接,两者之间有一个连接在加权图中,不同的链接具有不同的权重 .解决您的问题 - 第1部分
我们要做的是在代码中将图片表示为图形,所以让我们开始创建基本元素
Node
和Arc
:Node
节点有
Name
,因此我们可以识别节点 . 并且节点可以连接到其他节点,我们可以使用节点集合,但是您的节点是加权图,因此,每个连接必须由链接节点和它的权重来表示 . 因此,我们使用Arcs的集合 .Arc
真正简单的类,它包含链接的节点,以及连接的权重:
Graph
Graph是一种包装类,用于组织目的 . 我也为图表声明了一个Root,我们没有使用它,但在以下几种情况下很有用:
解决您的问题 - 第2部分
现在我们拥有了用于保存图形的所有数据结构,让我们用一些数据填充它 . 这是一些初始化类似于您的立方体图片的图形的代码 . 它枯燥乏味,但在现实生活中,图形将动态创建:
解决您的问题 - 第3部分
所以,我们有一个完整的初始化图,让我们创建矩阵 . 下一个方法创建一个二维矩阵,n乘n,其中n是我们从图类中得到的节点数 . 对于节点的Foreach,我们搜索它们是否有链接,如果它们有链接,则在适当的位置填充矩阵 . 看看在你的邻接矩阵示例中,你只有
1
s,这里我把链接的权重,我've put this way, so there'在加权图中没有意义!完成
完成后,你有加权邻接矩阵,有些方法可以打印它:
什么给我们以下输出: