- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我尝试实现加权图。快完成了,但我面临一个问题,我无法正确收集图形的所有连接节点。例如我有以下图表:
1 2 3 4 5 6
1 0 1 1 0 0 0
2 1 0 1 1 0 0
3 1 1 0 1 0 0
4 0 1 1 0 0 0
5 0 0 0 0 0 1
6 0 0 0 0 1 0
我想获得集合[[1,2,3,4],[5,6]]的结果集,如果没有循环,我的代码可以很好地工作,但如果有循环,我的代码就会进入无限循环。
节点类:
public class Node<T> {
private T content;
private Set<Node<T>> neighbors;
private boolean marked;
public Node(T content) {
super();
Validate.notNull(content, "Value of vertex can't be null!");
this.content = content;
this.neighbors = new HashSet<Node<T>>();
}
public T getContent() {
return content;
}
public void setContent(T content) {
this.content = content;
}
public boolean hasNeighbors() {
return !neighbors.isEmpty();
}
public void addNeighbor(Node<T> neighbor) {
this.neighbors.add(neighbor);
}
public Set<Node<T>> getNeighbors() {
return neighbors;
}
public void setNeighbors(Set<Node<T>> neighbors) {
this.neighbors = neighbors;
}
public boolean isMarked() {
return marked;
}
public void setMarked(boolean marked) {
this.marked = marked;
}
public Set<Node<T>> getAllRelatedNeighbors() {
Set<Node<T>> result = new HashSet<Node<T>>();
result.add(this);
if (neighbors.isEmpty()) {
return result;
}
for (Node<T> neighbor : neighbors) {
result.add(neighbor);
for(Node<T> nestedNeighbor: neighbor.getNeighbors()){
if(!nestedNeighbor.equals(this) ){
result.addAll(neighbor.getAllRelatedNeighbors());
}
}
}
return result;
}
@Override
public String toString() {
return "Vertex [content=" + content + ", marked=" + marked + "]";
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((content == null) ? 0 : content.hashCode());
result = prime * result + (marked ? 1231 : 1237);
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Node other = (Node) obj;
if (content == null) {
if (other.content != null)
return false;
} else if (!content.equals(other.content))
return false;
if (marked != other.marked)
return false;
return true;
}
}
public class Edge<T> {
private Node<T> first;
private Node<T> second;
private int weight;
public Edge(Node<T> first, Node<T> second, int weight) {
this(first, second);
this.weight = weight;
}
public Edge(Node<T> first, Node<T> second) {
super();
this.first = first;
this.second = second;
this.first.addNeighbor(second);
this.second.addNeighbor(first);
}
public Node<T> getFirst() {
return first;
}
public void setFirst(Node<T> first) {
this.first = first;
}
public Node<T> getSecond() {
return second;
}
public void setSecond(Node<T> second) {
this.second = second;
}
public int getWeight() {
return weight;
}
public void setWeight(int weight) {
this.weight = weight;
}
@Override
public String toString() {
return "Edge [first=" + first + ", second=" + second + ", weight="
+ weight + "]";
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((first == null) ? 0 : first.hashCode());
result = prime * result + ((second == null) ? 0 : second.hashCode());
result = prime * result + weight;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Edge other = (Edge) obj;
if (first == null) {
if (other.first != null)
return false;
} else if (!first.equals(other.first))
return false;
if (second == null) {
if (other.second != null)
return false;
} else if (!second.equals(other.second))
return false;
if (weight != other.weight)
return false;
return true;
}
}
public class WeightedGraph<T> {
private Set<Node<T>> nodes;
private Set<Edge<T>> edges;
public WeightedGraph(Collection<T> elements) {
this();
addNodes(convertCollectionOfElementsToNodes(elements));
}
public WeightedGraph(Set<Node<T>> nodes, Set<Edge<T>> edges) {
super();
validateParameters(nodes, edges);
this.nodes = nodes;
this.edges = edges;
}
public WeightedGraph() {
super();
this.nodes = new HashSet<Node<T>>();
this.edges = new HashSet<Edge<T>>();
}
public void addNode(Node<T> node) {
this.nodes.add(node);
}
public void addNodes(Set<Node<T>> nodes) {
this.nodes.addAll(nodes);
}
public void addEdge(Edge<T> edge) {
this.edges.add(edge);
}
public void addEdges(Set<Edge<T>> edges) {
this.edges.addAll(edges);
}
public Set<Node<T>> getNodes() {
return nodes;
}
public Set<Edge<T>> getEdges() {
return edges;
}
public void connectNodesBidirectional(Node<T> first, Node<T> second) {
connectNodesBidirectional(first, second, 0);
}
public void connectNodesBidirectional(Node<T> first, Node<T> second,
int weight) {
validateNode(first);
validateNode(second);
edges.add(new Edge<T>(first, second, weight));
edges.add(new Edge<T>(second, first, weight));
}
public void connectNodes(Node<T> first, Node<T> second) {
connectNodes(first, second, 0);
}
public void connectNodes(Node<T> first, Node<T> second, int weight) {
validateNode(first);
validateNode(second);
edges.add(new Edge<T>(first, second, weight));
}
private Set<Node<T>> convertCollectionOfElementsToNodes(Collection<T> elements){
Set<Node<T>> nodes = new HashSet<Node<T>>();
for(T element : elements) {
nodes.add(new Node<T>(element));
}
return nodes;
}
private void validateParameters(Set<Node<T>> nodes, Set<Edge<T>> edges) {
Validate.notNull(nodes, "Collection of nodes can't be null.");
Validate.notNull(edges, "Collection of nodes can't be null.");
for (Edge<T> edge : edges) {
Validate.isTrue(
nodes.contains(edge.getFirst())
&& nodes.contains(edge.getSecond()),
"Should be passed properly configured collection, each node of each edge should exist in node collection.");
}
}
private void validateNode(Node<T> node) {
Validate.notNull(node, "Node can't be null.");
Validate.isTrue(nodes.contains(node),
"Graph should contains specified node: " + node + ".");
}
}
测试类代码
WeightedGraph<Integer> graph = new WeightedGraph<Integer>();
Node<Integer> first = new Node<Integer>(1);
Node<Integer> second = new Node<Integer>(2);
Node<Integer> third = new Node<Integer>(3);
Node<Integer> fourth = new Node<Integer>(4);
graph.addNode(first);
graph.addNode(second);
graph.addNode(third);
graph.addNode(fourth);
graph.connectNodesBidirectional(first, second);
graph.connectNodesBidirectional(second, third);
graph.connectNodesBidirectional(first, third);
graph.connectNodesBidirectional(third, fourth);
graph.connectNodesBidirectional(fourth, second);
Set<Node<Integer>> nodes = graph.getNodes();
Set<Set<Node<Integer>>> result = new HashSet<Set<Node<Integer>>>();
for (Node<Integer> node : nodes) {
result.add(node.getAllRelatedNeighbors());
}
我希望你能帮我解决递归函数。感谢您抽出时间。
最佳答案
[从评论复制]在跟踪节点时,您需要跟踪您已经看到的节点,例如将您关注的所有节点放入一个集合中。每当您考虑一个新节点时,您都会检查您之前是否一直在关注此节点,如果是,则忽略它。
关于java - 如何递归获取图形中可以包含循环的所有连接节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22334641/
我正在使用 JavaFX 8 创建一个应用程序。我使用拖/放动态更改网格 Pane 的内容。我希望每行或每行/列迭代 GridPane 内容。JavaFX 允许通过指定行和列在 GridPane 中添
我正在尝试将图像拖放到div上。图像没有被拖到div上并给出以下错误 Uncaught TypeError: Failed to execute 'appendChild' on 'Node': pa
我正在 android studio 中创建内部构建 AR 导航。我正在寻找一种方法将 anchor 与其他 anchor 或 anchor 节点/节点“连接”起来。我不确定使用哪一个。基于我将强制用
我在 Hive 上运行一些作业:首先是 4 节点,然后是 2 节点。令我惊讶的是,我的 2 节点性能比我的 4 节点更好。 首先,我在一个 4 节点(4 个事件节点)上运行查询,然后关闭 2 个节点(
我有 Node* current ,我在其中存储指向列表“顶部”当前节点的指针。当我将一个新节点设置为当前节点时,出现错误: '=' : cannot convert from 'CircularDo
我是 dcos Mesos 的新手,在本地 Ubuntu 机器上安装了 dc os。 我可以查看 dcos 仪表板。 但我无法使用 dcos node ssh --master-proxy --lea
在 JavaFX 中,是否有类似 setLayout(); 的东西?或 setBounds(); ? 例如,我想将按钮定位到我想要的位置。 最佳答案 JavaFX 场景图上的所有内容都是 Node .
我正在开发一个 JavaFX 应用程序,其中我开发的类(从 javafx.scene.Parent 扩展)是根据用户在 ListView 控件中单击的条目动态创建的。 只是要清楚这个节点,它不是使用像
我正在尝试为节点-边缘关系创建一个类图,因为它可以在有向图中找到。我想传达的是,Nodes 引用了 Edges,Edges 也引用了 Nodes。每个 Edge 都恰好需要两个 Node(源和目标)。
在mapreduce作业期间,单个任务将在随机节点上运行,是否有任何方法限制应在其中运行任务的节点? 最佳答案 Hadoop不会选择节点来随机运行任务。考虑到数据局部性,否则将有很多网络开销。 任务与
有什么区别: a) nodetool 重建 b) nodetool 修复 [-pr] 换句话来说,各个命令到底是做什么的? 最佳答案 nodetool重建:类似于引导过程(当您向集群添加新节点时),但
我已将第一个 OneToMany 关系添加到我的 hibernate 3.6.10 项目中。这是一个类: /** * */ package com.heavyweightsoftware.leal
是否有可能找到正在监听触发当前函数的事件的元素? 在下面的代码中,event.target 返回 #xScrollPane 和 event.currentTarget 和 event 的最低子节点.f
我正在尝试覆盖我数据库中的一些数据。结构很简单,就是: recipes { user_1{ recipe_1{data} recipe_2{data} } user_2{
我使用 setInterval 来运行该函数,但它会多次执行函数 2... 如何在输入中插入一个值后执行函数 第一个输入与其余输入的距离不同 如何在插入 val(tab 选项)后将插入从 1 个输入移
我不知道代码有什么问题,但在 visual studio 中不断收到这些错误消息。 Error 18 error C1903: unable to recover from previous e
我正在尝试从其类中获取 SharePoint 搜索导航节点的对象。 var nodes = $("div.ms-qSuggest-listItem"); 我正在获取节点对象,现在想要获取“_promp
D:\nodeP>node main.js module.js:327 抛出错误; ^ 错误:在 Function.Module 的 Function.Module._resolveFilename
struct node{ int key, prior, cnt, val; node *l, *r; node(){} node(int nkey) : key(nkey),
我有以下代码使用迭代器将项目插入双链表。这就是我们被要求这样做的方式。代码有效,但问题是我有 24 字节的绝对内存泄漏。 NodeIterator insert(NodeIterator & itrP
我是一名优秀的程序员,十分优秀!