java邻接图_具有有向加权边的图的Java邻接列表实现(Java Adjacency list implementation of graph with directed weighted edge...

具有有向加权边的图的Java邻接列表实现(Java Adjacency list implementation of graph with directed weighted edges)

我正在尝试使用邻接列表在Java中实现定向加权边缘图。 它由一个大小等于顶点数的数组组成,数组的每个条目都是每个特定Vertex的后继者的LinkedList 。

我想为每个边添加权重,我想通过在LinkedList为每个successor Object添加权重标签来实现这一点,而且我想为每个Vertex添加其他变量以备将来使用。 如果我想这样做,我将不得不为顶点创建一个新的数据结构,并将一个单独的数据结构创建为邻接列表。 将两者结合为单一数据结构的有效设计是什么?

I am trying to implement a directed weighted edge graph in Java using adjacency lists. It consists of an array with the size equal to the number of vertices, each entry of the array is a LinkedList of the successors of that each particular Vertex.

I want to add weight to each edge, I was thinking of doing this by adding a weight label to each successor Object in the LinkedList, furthermore I want to add other variables per Vertex for future use. If I want to do this, I would have to create a new Data structure for the vertices and a separate one as an adjacency lists. What would be an efficient design to combine both as a single Data structure?

原文:https://stackoverflow.com/questions/40305225

2020-04-17 18:04

满意答案

您应该将图形表示为HashMap,其中key是顶点的标签,value是顶点对象。

HashMap graph = new HashMap();

Vertex是一个封装顶点属性的类。对于具有权重的相邻顶点,将有一个属性HashMap。

HashMap adjListWithWeights = new HashMap();

您可以通过Vertex类向图表添加更多功能和属性。

You should represent your graph as a HashMap where key is label of vertices and value is vertex objects.

HashMap graph = new HashMap();

Vertex is a class encapsulating vertex attributes.There will be an attribute HashMap for adjacent vertices with weights.

HashMap adjListWithWeights = new HashMap();

You can add more functionality and attributes to your graph through Vertex class.

2016-10-28

相关问答

有很多选择: 您可以将指针添加回ListNode类的标头,将其转换为完整的边缘表示。 您可以更改表示以使用专用的Vertex和Edge类。 您可以返回一个节点对(例如,大小为2的ListNode数组),其中包含表示起始边的ListNode和表示权重和目标的ListNode。 There are many options: You could add a pointer back to the header to the ListNode class, turning it into a full ...

您可以轻松实现邻接列表的类。 以下是我常常用作邻接列表的类,它也容易理解。 它将integer映射到linked list 。 class Adjacencylist {

private Map> adjacencyList;

public Adjacencylist(int v){ //Constructor

adjacencyList = new HashMap>...

itertools.groupby ( docs ),排序和dict理解的组合可以让你开始: from itertools import groupby

edges = [(1, 2), (2, 3), (1, 3)]

adj = {k: [v[1] for v in g] for k, g in groupby(sorted(edges), lambda e: e[0])}

# adj: {1: [2, 3], 2: [3]}

这将按其源节点对边进行排序和分组,并为每个源节点存储目标节点l...

可以使用BFS (广度优先搜索)在时间O(VE)中解决该问题。 关于BFS的事情是,它level by level遍历图形。 这意味着它首先遍历distance of 1 source vertex distance of 1的distance of 1处的所有source vertex 。 然后它遍历distance of 2 source vertex distance of 2的distance of 2处的所有source vertex ,依此类推。 因此,当我们到达distance of...

这就是我在c++加权图的典型表示: vector > > adj_list;

我使用std::pair来存储边缘,第一个元素是边缘的目标节点,第二个元素是它的权重。 根据具体情况,更好的方法可能是为节点使用自定义结构。 就像是: struct edge {

int to;

int weight;

};

....

vector > adj_list;

This is what my typical represent...

我认为这里不需要LinkedHashSet ,你可以用Map>表示图形。 isConnected基本上就是你已有的: public boolean isConnected(String node1, String node2) {

Map adjacent = map.get(node1);

if(adjacent==null) {

return false;

}

...

如果您真的想在图形中将顶点表示为(唯一)整数,则可以使用ArrayList从顶点映射到对象,并使用HashMap进行映射。 您可以将此对包装在您自己的类中,提供getIndex()和getElement() (如下面所示),这可以提高可读性。 那说,为什么不只是使用http://jgrapht.org或类似的图书馆? public class IndexMap {

private List elements = new ArrayList<>(...

国际海事组织,问题非常严厉。 如果你知道答案是显而易见的,如果你不知道,你就无法理解这个问题。 基本上,问题要求如下: 1)您正在寻找一些配方来生成具有规定数量的顶点/节点的有向图。 您应该指定图形的方式是方阵,即邻接矩阵A ,其中A[i,j] = 1表示从顶点/节点i到j 。 2)此配方应包括一些初始化步骤,该步骤涉及随机数,使得您最终得到任何特定图形的概率(例如完全连接的图形)对于所有可能的大小为n的图形是相同的。 IMO, the question is very badly phrased...

您的graph是指向Graph对象的指针。 该对象具有成员vertices ,即指向Vertex对象的指针数组。 因此,顶点位于graph->vertices ,顶点#0位于graph->vertices[0] 。 每个顶点都有一个成员first_edge ,它是指向其第一个边的指针。 因此,顶点#0的第一边缘是graph->vertices[0]->first_edge ,并且其权重例如在graph->vertices[0]->first_edge->weight 。 邻接列表上的下一个边是第一...

您应该将图形表示为HashMap,其中key是顶点的标签,value是顶点对象。 HashMap graph = new HashMap();

Vertex是一个封装顶点属性的类。对于具有权重的相邻顶点,将有一个属性HashMap。 HashMap adjListWithWeights = new HashMap();

您可以通过Vertex类向图表添加更多功能和属性。 ...

相关文章

java List对象排序有多种方法,下面是其中两种 第一种方法,list中的对象实现Comparab

...

列表就像java里的collection,所具有的特性也要比元组更多,更灵活,其character总结

...

我们上一节认识了FreeMarker基本数据类型,接口认识FreeMarker集合(List、Map)

...

List的size大于0,但是取到的值为null,谁见过这种情况? List list=XXDAO.

...

List按对象进入的顺序保存对象,不做排序或编辑操作。Set对每个对象只接受一次,并使用自己内部的排序

...

源码解读Mybatis List列表In查询实现的注意事项 在SQL开发过程中,动

...

Windowsis an extremely effective and a an efficient

...

在java操作redis中,咱们已经有了基本的java操作redis相关代码。下面继续 redis存放

...

查询方法如下: public List<T> find(String hql, Obje

...

用过struts的标签,也接触过spring的标签,不过我个人觉得el表达式是最好用的。el表达式判断

...

最新问答

如果启用了复制处理程序,请确保将其置于其中一个安全角色之后。 我见过人们做的另一件事是在不同的端口上运行admin。 最好在需要auth的页面上使用SSL,这样你就不会发送明确的密码,因此管理和复制将发生在8443上,而常规查询将在8080上发生。 如果您要签署自己的证书,请查看此有用的SO页面: 如何在特定连接上使用不同的证书? I didn't know that /admin was the context for SOLR admin because /admin does not re

第一:在您的样本中,您有: 但是你在询问 //td[@class=‘CarMiniProfile-TableHeader’] (注意TableHeader中的大写'T')。 xpath区分大小写。 第二:通过查询// td [@ class ='CarMiniProfile-TableHeader'] / td,你暗示你在外部td中有一个'td'元素,而它们是兄弟姐妹。 有很多方法可以在这里获得制作和模型

这是你的答案: http://jsfiddle.net/gPsdk/40/ .preloader-container { position: absolute; top: 0px; right: 0px; bottom: 0px; left: 0px; background: #FFFFFF; z-index: 5; opacity: 1; -webkit-transition: all 500ms ease-out;

问题是,在启用Outlook库引用的情况下, olMailItem是一个保留常量,我认为当您将Dim olMailItem as Outlook.MailItem ,这不是问题,但是尝试设置变量会导致问题。 以下是完整的解释: 您已将olMailItem声明为对象变量。 在赋值语句的右侧,在将其值设置为对象的实例之前,您将引用此Object 。 这基本上是一个递归错误,因为你有对象试图自己分配自己。 还有另一个潜在的错误,如果之前已经分配了olMailItem ,这个语句会引发另一个错误(可能是

我建议使用wireshark http://www.wireshark.org/通过记录(“捕获”)设备可以看到的网络流量副本来“监听”网络上发生的对话。 当您开始捕获时,数据量似乎过大,但如果您能够发现任何看起来像您的SOAP消息的片段(应该很容易发现),那么您可以通过右键单击并选择来快速过滤到该对话'关注TCP Stream'。 然后,您可以在弹出窗口中查看您编写的SOAP服务与Silverlight客户端之间的整个对话。 如果一切正常,请关闭弹出窗口。 作为一个额外的好处,wireshar

Android默认情况下不提供TextView的合理结果。 您可以使用以下库并实现适当的aligntment。 https://github.com/navabi/JustifiedTextView Android Does not provide Justified aligntment of TextView By default. You can use following library and achieve proper aligntment. https://github.com/

你的代码适合我: class apples { public static void main(String args[]) { System.out.println("Hello World!"); } } 我将它下载到c:\ temp \ apples.java。 以下是我编译和运行的方式: C:\temp>javac -cp . apples.java C:\temp>dir apples Volume in drive C is HP_PAV

12个十六进制数字(带前导0x)表示48位。 那是256 TB的虚拟地址空间。 在AMD64上阅读wiki(我假设你在上面,对吗?)架构http://en.wikipedia.org/wiki/X86-64 12 hex digits (with leading 0x) mean 48 bits. That is 256 TB of virtual address space. Read wiki on AMD64 (I assume that you are on it, right?) ar

这将取决于你想要的。 对象有两种属性:类属性和实例属性。 类属性 类属性对于类的每个实例都是相同的对象。 class MyClass: class_attribute = [] 这里已经为类定义了MyClass.class_attribute ,您可以使用它。 如果您创建MyClass实例,则每个实例都可以访问相同的class_attribute 。 实例属性 instance属性仅在创建实例时可用,并且对于类的每个实例都是唯一的。 您只能在实例上使用它们。 在方法__init__中定

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值