为加权图生成邻接矩阵

2024-04-08

我正在尝试实施弗洛伊德-沃歇尔算法 http://en.wikipedia.org/wiki/Floyd%E2%80%93Warshall_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;
            }
        }
    }

}

这是手头的具体图表:

这是我需要创建的矩阵的图片。很抱歉质量太糟糕了...


所以,你似乎不太熟悉Graphs http://en.wikipedia.org/wiki/Graph_%28mathematics%29,看看维基百科。还可以浏览一些图片,这样会更容易理解。

一点概念

你的图片可以表示为Graph。一般来说,图表是使用两种基本元素来实现的,Nodes and Links(有时称为Arcs).

A Node代表你图片中的字母,它们是A、B、C等。 一个Arc or Link,是连接两个节点的线,如果你看H到L之间的连接,两者之间有一个链接,在加权图中,不同的链接有不同的权重。

解决您的问题 - 第 1 部分

我们要做的就是在代码中将您的图片表示为图形,所以让我们开始创建基本元素Node and Arc:

Node

一个节点有一个Name,这样我们就可以识别该节点。一个节点可以连接到其他节点,我们可以使用节点的集合,但你的是一个加权图,因此,每个连接都必须由链接的节点及其权重表示。因此,我们使用 Arcs 的集合。

public class Node
{
    public string Name;
    public List<Arc> Arcs = new List<Arc>();

    public Node(string name)
    {
        Name = name;
    }

    /// <summary>
    /// Create a new arc, connecting this Node to the Nod passed in the parameter
    /// Also, it creates the inversed node in the passed node
    /// </summary>
    public Node AddArc(Node child, int w)
    {
        Arcs.Add(new Arc
        {
            Parent = this,
            Child = child,
            Weigth = w
        });

        if (!child.Arcs.Exists(a => a.Parent == child && a.Child == this))
        {
            child.AddArc(this, w);
        }

        return this;
    }
}

Arc

非常简单的类,它包含链接的节点以及连接的权重:

public class Arc
{
    public int Weigth;
    public Node Parent;
    public Node Child;
}

Graph

Graph 是一种包装类,用于组织目的。我还为图表声明了一个根,我们没有使用它,但在几种情况下很有用:

public class Graph
{
    public Node Root;
    public List<Node> AllNodes = new List<Node>();

    public Node CreateRoot(string name)
    {
        Root = CreateNode(name);
        return Root;
    }

    public Node CreateNode(string name)
    {
        var n = new Node(name);
        AllNodes.Add(n);
        return n;
    }

    public int?[,] CreateAdjMatrix()
    {
        // Matrix will be created here...
    }
}

解决您的问题 - 第 2 部分

现在我们已经拥有了保存图形的所有数据结构,让我们用一些数据填充它。下面是一些初始化与立方体图片类似的图形的代码。这很无聊,但在现实生活中,图表将是动态创建的:

static void Main(string[] args)
{
    var graph = new Graph();

    var a = graph.CreateRoot("A");
    var b = graph.CreateNode("B");
    var c = graph.CreateNode("C");
    var d = graph.CreateNode("D");
    var e = graph.CreateNode("E");
    var f = graph.CreateNode("F");
    var g = graph.CreateNode("G");
    var h = graph.CreateNode("H");
    var i = graph.CreateNode("I");
    var j = graph.CreateNode("J");
    var k = graph.CreateNode("K");
    var l = graph.CreateNode("L");
    var m = graph.CreateNode("M");
    var n = graph.CreateNode("N");
    var o = graph.CreateNode("O");
    var p = graph.CreateNode("P");

    a.AddArc(b, 1)
     .AddArc(c, 1);

    b.AddArc(e, 1)
     .AddArc(d, 3);

    c.AddArc(f, 1)
     .AddArc(d, 3);

    c.AddArc(f, 1)
     .AddArc(d, 3);

    d.AddArc(h, 8);

    e.AddArc(g, 1)
     .AddArc(h, 3);

    f.AddArc(h, 3)
     .AddArc(i, 1);

    g.AddArc(j, 3)
     .AddArc(l, 1);

    h.AddArc(j, 8)
     .AddArc(k, 8)
     .AddArc(m, 3);

    i.AddArc(k, 3)
     .AddArc(n, 1);

    j.AddArc(o, 3);

    k.AddArc(p, 3);

    l.AddArc(o, 1);

    m.AddArc(o, 1)
     .AddArc(p, 1);

    n.AddArc(p, 1);

    // o - Already added

    // p - Already added

    int?[,] adj = graph.CreateAdjMatrix(); // We're going to implement that down below

    PrintMatrix(ref adj, graph.AllNodes.Count); // We're going to implement that down below
}

解决您的问题 - 第 3 部分

所以,我们有一个完全初始化的图,让我们创建矩阵。下一个方法创建一个二维矩阵,n × n,其中 n 是我们从图类中获得的节点数。对于每个节点,我们搜索它们是否有链接,如果它们有链接,则将矩阵填充到适当的位置。看看你的邻接矩阵示例,你只有1s,这里我放置了链接的权重,我是这样放置的,所以拥有加权图是没有意义的!

public int?[,] CreateAdjMatrix()
{
    int?[,] adj = new int?[AllNodes.Count, AllNodes.Count];

    for (int i = 0; i < AllNodes.Count; i++)
    {
        Node n1 = AllNodes[i];

        for (int j = 0; j < AllNodes.Count; j++)
        {
            Node n2 = AllNodes[j];

            var arc = n1.Arcs.FirstOrDefault(a => a.Child == n2);

            if (arc != null)
            {
                adj[i, j] = arc.Weigth;
            }
        }
    }
    return adj;
}

Done

完成后,您就有了加权邻接矩阵,可以通过某种方式打印它:

private static void PrintMatrix(ref int?[,] matrix, int Count)
{
    Console.Write("       ");
    for (int i = 0; i < Count; i++)
    {
        Console.Write("{0}  ", (char)('A' + i));
    }

    Console.WriteLine();

    for (int i = 0; i < Count; i++)
    {
        Console.Write("{0} | [ ", (char)('A' + i));

        for (int j = 0; j < Count; j++)
        {
            if (i == j)
            {
                Console.Write(" &,");
            }
            else if (matrix[i, j] == null)
            {
                Console.Write(" .,");
            }
            else
            {
                Console.Write(" {0},", matrix[i, j]);
            }

        }
        Console.Write(" ]\r\n");
    }
    Console.Write("\r\n");
}

是什么给了我们以下输出:

       A  B  C  D  E  F  G  H  I  J  K  L  M  N  O  P
A | [  &, 1, 1, ., ., ., ., ., ., ., ., ., ., ., ., ., ]
B | [  1, &, ., 3, 1, ., ., ., ., ., ., ., ., ., ., ., ]
C | [  1, ., &, 3, ., 1, ., ., ., ., ., ., ., ., ., ., ]
D | [  ., 3, 3, &, ., ., ., 8, ., ., ., ., ., ., ., ., ]
E | [  ., 1, ., ., &, ., 1, 3, ., ., ., ., ., ., ., ., ]
F | [  ., ., 1, ., ., &, ., 3, 1, ., ., ., ., ., ., ., ]
G | [  ., ., ., ., 1, ., &, ., ., 3, ., 1, ., ., ., ., ]
H | [  ., ., ., 8, 3, 3, ., &, ., 8, 8, ., 3, ., ., ., ]
I | [  ., ., ., ., ., 1, ., ., &, ., 3, ., ., 1, ., ., ]
J | [  ., ., ., ., ., ., 3, 8, ., &, ., ., ., ., 3, ., ]
K | [  ., ., ., ., ., ., ., 8, 3, ., &, ., ., ., ., 3, ]
L | [  ., ., ., ., ., ., 1, ., ., ., ., &, ., ., 1, ., ]
M | [  ., ., ., ., ., ., ., 3, ., ., ., ., &, ., 1, 1, ]
N | [  ., ., ., ., ., ., ., ., 1, ., ., ., ., &, ., 1, ]
O | [  ., ., ., ., ., ., ., ., ., 3, ., 1, 1, ., &, ., ]
P | [  ., ., ., ., ., ., ., ., ., ., 3, ., 1, 1, ., &, ]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为加权图生成邻接矩阵 的相关文章

  • 将复选框添加到 UniformGrid

    我正在尝试将复选框动态添加到 wpf 中的统一网格中 但看起来网格没有为它们分配足够的空间 所以它们都有点互相重叠 这就是我将它们添加到后面的代码中的方法 foreach string folder in subfolders PathCh
  • 获取按下的按钮的返回值

    我有一个在特定事件中弹出的表单 它从数组中提取按钮并将标签值设置为特定值 因此 如果您要按下或单击此按钮 该函数应返回标签值 我怎样才能做到这一点 我如何知道点击了哪个按钮 此时代码返回 DialogResult 但我想从函数返回 Tag
  • 将数组向左或向右旋转一定数量的位置,复杂度为 o(n)

    我想编写一个程序 根据用户的输入 正 gt 负 include
  • 如何避免情绪低落?

    我有一个实现状态模式每个状态处理从事件队列获取的事件 根据State因此类有一个纯虚方法void handleEvent const Event 事件继承基础Event类 但每个事件都包含其可以是不同类型的数据 例如 int string
  • 使闭包捕获的变量变得易失性

    闭包捕获的变量如何与不同线程交互 在下面的示例代码中 我想将totalEvents 声明为易失性的 但C 不允许这样做 是的 我知道这是错误的代码 这只是一个例子 private void WaitFor10Events volatile
  • 在 Visual Studio 2008 上设置预调试事件

    我想在 Visual Studio 中开始调试程序之前运行一个任务 我每次调试程序时都需要运行此任务 因此构建后事件还不够好 我查看了设置的 调试 选项卡 但没有这样的选项 有什么办法可以做到这一点吗 你唯一可以尝试的 IMO 就是尝试Co
  • C - 找到极限之间的所有友好数字

    首先是定义 一对友好的数字由两个不同的整数组成 其中 第一个整数的除数之和等于第二个整数 并且 第二个整数的除数之和等于第一个整数 完美数是等于其自身约数之和的数 我想做的是制作一个程序 询问用户一个下限和一个上限 然后向他 她提供这两个限
  • 获取没有非标准端口的原始 url (C#)

    第一个问题 环境 MVC C AppHarbor Problem 我正在调用 openid 提供商 并根据域生成绝对回调 url 在我的本地机器上 如果我点击的话 效果很好http localhost 12345 login Request
  • 将目录压缩为单个文件的方法有哪些

    不知道怎么问 所以我会解释一下情况 我需要存储一些压缩文件 最初的想法是创建一个文件夹并存储所需数量的压缩文件 并创建一个文件来保存有关每个压缩文件的数据 但是 我不被允许创建许多文件 只能有一个 我决定创建一个压缩文件 其中包含有关进一步
  • 如果使用 SingleOrDefault() 并在数字列表中搜索不在列表中的数字,如何返回 null?

    使用查询正数列表时SingleOrDefault 当在列表中找不到数字时 如何返回 null 或像 1 这样的自定义值 而不是类型的默认值 在本例中为 0 你可以使用 var first theIntegers Cast
  • Cython 和类的构造函数

    我对 Cython 使用默认构造函数有疑问 我的 C 类 Node 如下 Node h class Node public Node std cerr lt lt calling no arg constructor lt lt std e
  • for循环中计数器变量的范围是多少?

    我在 Visual Studio 2008 中收到以下错误 Error 1 A local variable named i cannot be declared in this scope because it would give a
  • 实体框架 4 DB 优先依赖注入?

    我更喜欢创建自己的数据库 设置索引 唯一约束等 使用 edmx 实体框架设计器 从数据库生成域模型是轻而易举的事 现在我有兴趣使用依赖注入来设置一些存储库 我查看了 StackOverflow 上的一些文章和帖子 似乎重点关注代码优先方法
  • 在 Dynamics CRM 插件中访问电子邮件发件人地址

    我正在编写一个 Dynamics CRM 2011 插件 该插件挂钩到电子邮件实体的更新后事件 阶段 40 pipeline http msdn microsoft com en us library gg327941 aspx 并且在此阶
  • WCF:将随机数添加到 UsernameToken

    我正在尝试连接到用 Java 编写的 Web 服务 但有些东西我无法弄清楚 使用 WCF 和 customBinding 几乎一切似乎都很好 除了 SOAP 消息的一部分 因为它缺少 Nonce 和 Created 部分节点 显然我错过了一
  • 32 位到 64 位内联汇编移植

    我有一段 C 代码 在 GNU Linux 环境下用 g 编译 它加载一个函数指针 它如何执行并不重要 使用一些内联汇编将一些参数推送到堆栈上 然后调用该函数 代码如下 unsigned long stack 1 23 33 43 save
  • const、span 和迭代器的问题

    我尝试编写一个按索引迭代容器的迭代器 AIt and a const It两者都允许更改容器的内容 AConst it and a const Const it两者都禁止更改容器的内容 之后 我尝试写一个span
  • mysql-connector-c++ - “get_driver_instance”不是“sql::mysql”的成员

    我是 C 的初学者 我认为学习的唯一方法就是接触一些代码 我正在尝试构建一个连接到 mysql 数据库的程序 我在 Linux 上使用 g 没有想法 我运行 make 这是我的错误 hello cpp 38 error get driver
  • C 中的异或运算符

    在进行按位操作时 我在确定何时使用 XOR 运算符时遇到一些困难 按位与和或非常简单 当您想要屏蔽位时 请使用按位 AND 常见用例是 IP 寻址和子网掩码 当您想要打开位时 请使用包含或 然而 XOR 总是让我明白 我觉得如果在面试中被问
  • 恢复上传文件控制

    我确实阅读了以下帖子 C 暂停 恢复上传 https stackoverflow com questions 1048330 pause resume upload in c 使用 HTTP 恢复上传 https stackoverflow

随机推荐

  • 如何使引导轮播上的文本保持不变,而图像移动?

    基本上 我让轮播正常工作 但我只希望图像能够过渡 但每张幻灯片上的文本都相同 理想情况下 文本不会移动 但图像会在背景中移动 这是一个例子 http www bootply com pINPxqzlJ2 http www bootply c
  • ProcessBuilder的正确使用

    经过研究 我注意到使用 java 的 ProcessBuilder 的 正确 方法是生成另外两个线程来管理新创建进程的 stdout stderr 的吞噬 这样它就不会挂起 如下所示 java世界文章 http www javaworld
  • django.db.utils.ProgrammingError:类型“raster”不存在

    我的模型 我在这里创建了 3 个模型 当我迁移时 我收到错误 from django contrib gis db import models from django contrib gis db models fields import
  • Maven 无法使用 OpenJDK 11 找到 jaxb-api,即使它存在于存储库中

    我有一台装有 Windows 操作系统的机器 它用于构建一些 WAR 项目 它有已安装 Java 8在上面 我在用Maven 3 2 5构建这些 WAR 项目 一切正常 但由于 Java 8 由于免费更新的结束而在未来会成为一个问题 所以我
  • 将轮分解添加到不定筛

    我正在修改埃拉托色尼的不定筛here https stackoverflow com a 10733621因此 它使用轮分解来跳过比当前仅检查所有赔率的形式更多的组合 我已经弄清楚了如何生成到达轮子上所有间隙所需的步骤 从那里我想我可以用
  • Azure DevOps 扩展中的节点密码警告 - 发布任务

    我正在开展一个开发 Azure DevOps 发布任务扩展的项目 最近 当发布任务运行时 我在日志中多次打印此警告消息 警告 使用 Cipheriv 作为 aes 256 ctr 的计数器模式 我没有更早得到它 当我开始收到此错误时 我只更
  • C 到 MIPS - 函数和数组

    我正在尝试将以下 C 代码转换为 MIPS 程序集 数组的基地址存储在 a0中 变量索引存储在 a1中 变量 x 存储在 t0 中 void ld array char array int index x array index 当索引是一
  • 如何通过 Grails 使用 imgscalr

    我最近几天才开始使用 Groovy 和 Grails 我之前没有任何 Java 经验 所以您必须原谅这个 可能 非常基本的问题 我搜索了 Google 和 Stack Overflow 但没有找到任何可以帮助我实际安装的内容 我已经可以上传
  • Elasticsearch 通过另一个文档查找文档

    我想在elasticsearch中搜索与id docId给定文档具有完全相同字段的文档 例如用户使用 docId 调用 api 我想过滤文档 以便返回的所有文档都满足 docId 中的某些参数 例如 我可以像这样查询 Elasticsear
  • TypeScript“保存时编译”功能在 Visual Studio 2015 中不起作用

    升级到 Visual Studio 2015 后 保存时编译 功能对我不起作用 当我对 ts将文件添加到我的项目中并保存 IDE 底部的状态栏显示Output s generated successfully 但是生成的 js文件没有改变
  • Linux/C下判断两个文件路径是否指向同一个文件?

    在Linux下 我有两个文件路径A和B const char A const char B 我现在想确定 我是否应该open 2 他们俩 int fda open A int fdb open B 我会在文件系统中打开同一个文件的两个文件句
  • Asp.Net Mvc 3 客户端验证、属性生成

    Asp net Mvc3 在输入元素上添加了一些自定义属性 例如 data val required 以执行验证 我知道这背后的所有理论 以及它是如何运作的 我想知道的是 当我在 using Html BeginForm 中创建表单时 它会
  • 如何使用seaborn为我的DataFrame创建堆积条形图[重复]

    这个问题在这里已经有答案了 我有一个数据框df df pd DataFrame columns App Feature1 Feature2 Feature3 Feature4 Feature5 Feature6 Feature7 Featu
  • 如何解析非结构化表状数据?

    我有一个text file保存操作的一些结果 数据显示在human readable format 就像一张桌子 我如何解析这些数据 以便形成一个数据结构 例如dictionaries有了这个数据 的一个例子unstructured dat
  • 获取所有不到一个月的物品

    有没有办法在 Django 中获取日期小于一个月前的所有对象 就像是 items Item objects filter less than a month old order by 你对 月 的定义是什么 30天 31天 除此之外 这应该
  • 如何将参数值传递给 a4j:jsFunction

    在我的页面上有一个按钮 可以在弹出窗口中打开项目列表 当我在列表中选择一个项目时 我想将该项目的 id 传递给我的第一页的 backingbean 是否可以 它尝试这样做a4j jsFunction and a4j param但它不起作用
  • 如何在 php 中创建可编辑的 Pdf 表单

    我有一个简单的表单 我想使用 php 使其可以在 pdf 中编辑 但是 pdf 正在创建表单 但我无法编辑和提交它 有什么原因或者我无法使用 php 编辑 pdf 我的代码是
  • 从 Firebase 数据库检索特定数据

    我正在使用 Firebase 数据库和 Java 在 Android 上创建一个聊天应用程序 每当用户首次注册时 它会将其用户名存储到节点下的数据库中user UserID profile username 用户名使用 User 类存储 这
  • 包含 iframe 中的 iframe 的目标父 div

    所以基本上我有这样的东西 div class iframe holder span span div gt div class iframe holder span span div gt div class iframe holder s
  • 为加权图生成邻接矩阵

    我正在尝试实施弗洛伊德 沃歇尔算法 http en wikipedia org wiki Floyd E2 80 93Warshall algorithm 为此 我需要设置一个adjacency matrix的加权图 我该怎么做呢 我知道这