如何在java中表示无向加权图
我正在做一些关于图的研究,因为这不完全是我的研究领域,我真的很难表示一个无向加权图,但我认为我遵循了错误的想法,遵循一些代码:如何在java中表示无向加权图,java,graph,Java,Graph,我正在做一些关于图的研究,因为这不完全是我的研究领域,我真的很难表示一个无向加权图,但我认为我遵循了错误的想法,遵循一些代码: 公共类顶点{//这里没有什么新东西。。。 私有字符串标签; 公共顶点(字符串页面对象){ this.label=页面对象; } //布拉布拉。 } 我想这就是我开始做错事情的地方: 公共类边缘{ private String source;//source?如果它是双向的,就不应该有一个源,或者我错了吗?就像从起点看它是源一样? 私有整数权重; 私有字符串目标;//这
公共类顶点{//这里没有什么新东西。。。
私有字符串标签;
公共顶点(字符串页面对象){
this.label=页面对象;
}
//布拉布拉。
}
我想这就是我开始做错事情的地方:
公共类边缘{
private String source;//source?如果它是双向的,就不应该有一个源,或者我错了吗?就像从起点看它是源一样?
私有整数权重;
私有字符串目标;//这里也是一样。
公共边缘(字符串源、整数权重、字符串目标){
this.source=源;
重量=重量;
this.destination=目的地;
}
}
在这里,我真的迷路了:
public class Graph { // Really struggling to represent it here.
private Map<Vertex, List<Edge>> adjVertices;
}
// I think the wrong idea about the graph above may lead to results like this below, and it seems wrong, like Earth being the key, and also the source...
// Just an example:
{
"Earth":{
"source":"Earth",
"weight":150,
"destination":"Jupiter"
}
}
public-class-Graph{//在这里很难表示它。
私有地图顶点;
}
//我认为对上面图表的错误想法可能会导致下面这样的结果,这似乎是错误的,就像地球是关键,也是源头。。。
//举个例子:
{
“地球”:{
“来源”:“地球”,
“重量”:150,
“目的地”:“木星”
}
}
几乎每个例子都与有向图有关,所以我需要一些关于如何从零开始纠正或执行它的说明。有许多不同的方法来表示顶点、边和图。这里有一个过于简化的例子: 定义方向边:
class Edge {
private Vertex to;
private int weight;
public Edge(Vertex to, int weight) {
super();
this.to = to;
this.weight = weight;
}
Vertex getTo() {
return to;
}
int getWeight() {
return weight;
}
//todo override hashCode()
}
定义一个顶点,使每个顶点都有一个到其相邻顶点的边的集合:
class Vertex {
private String label;
private Set<Edge> edges; //collection of edges to neighbors
public Vertex(String pageObject) {
this.label = pageObject;
edges = new HashSet<>();
}
String getLabel() {
return label;
}
boolean addEdge(Edge edge){
return edges.add(edge);
}
List<Edge> getEdges() {
return new ArrayList<>(edges);
}
//todo override hashCode()
}
有许多不同的方法来表示顶点、边和图形。这里有一个过于简化的例子:
定义方向边:
class Edge {
private Vertex to;
private int weight;
public Edge(Vertex to, int weight) {
super();
this.to = to;
this.weight = weight;
}
Vertex getTo() {
return to;
}
int getWeight() {
return weight;
}
//todo override hashCode()
}
定义一个顶点,使每个顶点都有一个到其相邻顶点的边的集合:
class Vertex {
private String label;
private Set<Edge> edges; //collection of edges to neighbors
public Vertex(String pageObject) {
this.label = pageObject;
edges = new HashSet<>();
}
String getLabel() {
return label;
}
boolean addEdge(Edge edge){
return edges.add(edge);
}
List<Edge> getEdges() {
return new ArrayList<>(edges);
}
//todo override hashCode()
}
嘿通常,图是用邻接矩阵或邻接列表表示的。你试过了吗?嘿!通常,图是用邻接矩阵或邻接列表表示的。你试过了吗?从你的答案我怎么能把它转换成无向图呢?就像我看到了很多例子,包括有向图,但不是无向图。。。在您的示例中,边缘有一个方向。此实现可用于定向和非定向。事实上,本例中构造的图是非定向的:从x->y返回的权重与从y->x返回的权重相同。我在代码中添加了一条注释。这个细节很有意义,让我思考了一件事,当我使用不同的权重时会发生什么?这是另一种情况吗?但不管怎样,你确实回答了我最初的问题,谢谢!不客气。您可以通过将addEdge(Edge-Edge)
替换为addEdge(顶点v1,顶点v2,int-weight)
来强制图形取消定向从您的答案中如何将其转换为无向图?就像我看到了很多例子,包括有向图,但不是无向图。。。在您的示例中,边缘有一个方向。此实现可用于定向和非定向。事实上,本例中构造的图是非定向的:从x->y返回的权重与从y->x返回的权重相同。我在代码中添加了一条注释。这个细节很有意义,让我思考了一件事,当我使用不同的权重时会发生什么?这是另一种情况吗?但不管怎样,你确实回答了我最初的问题,谢谢!不客气。您可以通过将addEdge(Edge-Edge)
替换为addEdge(顶点v1、顶点v2、整数权重)