Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 向图表中添加新边,并检查总重量是否减少_Java_Algorithm_Graph_Graph Algorithm - Fatal编程技术网

Java 向图表中添加新边,并检查总重量是否减少

Java 向图表中添加新边,并检查总重量是否减少,java,algorithm,graph,graph-algorithm,Java,Algorithm,Graph,Graph Algorithm,我是图形新手,我正在尝试用Java解决这个问题: 给定一个具有N个节点和N-1个加权双向边的图,该算法必须响应 如果新边“q”允许减少图形的总体权重,则为是,否则为否 如果存在一条边“e”,使得可以 将“e”替换为“q”,使图形保持连接并减小其总权重 我用邻接列表实现了图形: public class Vertex { private final int element; private final Set<Edge> edges; // Collection of edges to

我是图形新手,我正在尝试用Java解决这个问题:

给定一个具有N个节点和N-1个加权双向边的图,该算法必须响应 如果新边“q”允许减少图形的总体权重,则为是,否则为否

如果存在一条边“e”,使得可以 将“e”替换为“q”,使图形保持连接并减小其总权重

我用邻接列表实现了图形:

public class Vertex {
private final int element;
private final Set<Edge> edges; // Collection of edges to neighbors

public Vertex(int element) {
    this.element = element;
    edges = new HashSet<>();
}

public int getElement() {
    return element;
}

public boolean addEdge(Edge edge) {
    return edges.add(edge);
}

public List<Edge> getEdges() {
    return new ArrayList<>(edges);
}
}
和一个图形类:

public class Graph {
   private final Set<Vertex> vertices; // Collection of all vertices

   public Graph() {
       vertices = new HashSet<>();
   }

   public List<Vertex> getVertices() {
       return new ArrayList<>(vertices);
   }

   public boolean addVertex(Vertex vertex) {
       return vertices.add(vertex);
   }
}
公共类图{
私有最终集顶点;//所有顶点的集合
公共图(){
顶点=新的HashSet();
}
公共列表getVertices(){
返回新的ArrayList(顶点);
}
公共布尔添加顶点(顶点){
返回顶点。添加(顶点);
}
}
有没有一种算法可以用来解决这个问题

给定一个具有N个节点和N-1个加权双向边的图

那么这个图就是一个。树的一个有用特性是,对于树中的任意两个节点s和t,它们之间存在一条唯一(简单)路径

如果新边“q”允许减少图形的总体权重,则算法必须回答“是”,否则回答“否”

在树中的两个节点(例如,s和t)之间添加新边将创建一个循环。删除此新循环中的任何边将创建一个新的(连接的)图形,该图形也是一棵树

如果存在一条边“e”,使得可以用“q”替换“e”,使图形保持连接并减小其总权重,则边“q”满足此条件


只有在从s到t(或t到s)的路径中存在一条或多条权重大于新边q权重的边时,才能满足此条件。如果存在多个这样的边,则可以替换其中任何一个。

是否只有一个边的查询
q
?还是多重?如果有多个查询,则您只需回答“是/否”,而无需修改图形或替换该边,并将修改后的图形用于其余查询?有多个查询,每个查询的图形必须是相同的图形,因此每次查询后必须恢复图形。我需要为项目使用相同的实现,你找到有效的算法了吗?所以我需要简单地添加新边并检查循环,一旦找到循环,我必须找到任何权重低于添加的边并将其删除。循环的问题是,我尝试了一种方法,但由于以下说明,它总是返回真值:
map.get(edge.source).add(edge);map.get(edge.destination).add(edge)。所以每一条边都是一个循环。我不知道图形的实现是否错误,或者循环检测方法是否错误。如果要减少图形的总权重,则需要删除权重高于新边的边。不要先添加边。只需在图中找到新边端点之间的路径。然后,您可以删除其中任何一条边,从而创建一个断开连接的图形。添加新边将重新连接图形。我建议手工做一两个例子。我写了我现在在问题中加起来的代码,但是我仍然错过了一些东西,因为它不起作用properly@Raul代码不会检查路径中的边,而是检查与目标相邻的所有边。
public class Graph {
   private final Set<Vertex> vertices; // Collection of all vertices

   public Graph() {
       vertices = new HashSet<>();
   }

   public List<Vertex> getVertices() {
       return new ArrayList<>(vertices);
   }

   public boolean addVertex(Vertex vertex) {
       return vertices.add(vertex);
   }
}