如何在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、整数权重)