代码模块化、去耦合,构建和测试过程合理 编写java代码有向图节点为node 边为edge 求该图形的两点之间最短路径及长度。如果不可达则写成-1。
时间: 2023-08-31 13:35:19 浏览: 159
Floyd算法,求有向图中各顶点之间的最短路径及其长度
5星 · 资源好评率100%
### 回答1:
以下是Java代码,实现了求有向图中两点之间的最短路径及长度,使用Dijkstra算法实现。代码已经进行了模块化和去耦合,构建和测试过程也是合理的。
Node.java
```java
public class Node {
private int id;
public Node(int id) {
this.id = id;
}
public int getId() {
return id;
}
}
```
Edge.java
```java
public class Edge {
private Node from;
private Node to;
private int weight;
public Edge(Node from, Node to, int weight) {
this.from = from;
this.to = to;
this.weight = weight;
}
public Node getFrom() {
return from;
}
public Node getTo() {
return to;
}
public int getWeight() {
return weight;
}
}
```
ShortestPath.java
```java
import java.util.*;
public class ShortestPath {
private Map<Node, List<Edge>> graph;
public ShortestPath(Map<Node, List<Edge>> graph) {
this.graph = graph;
}
public int shortestPath(Node start, Node end) {
Map<Node, Integer> distances = new HashMap<>();
Map<Node, Node> parents = new HashMap<>();
PriorityQueue<Node> queue = new PriorityQueue<>((n1, n2) -> distances.getOrDefault(n1, Integer.MAX_VALUE)
- distances.getOrDefault(n2, Integer.MAX_VALUE));
distances.put(start, 0);
queue.offer(start);
while (!queue.isEmpty()) {
Node currNode = queue.poll();
if (currNode.equals(end)) {
return distances.get(end);
}
for (Edge edge : graph.getOrDefault(currNode, Collections.emptyList())) {
Node nextNode = edge.getTo();
int distanceFromStart = distances.get(currNode) + edge.getWeight();
if (distanceFromStart < distances.getOrDefault(nextNode, Integer.MAX_VALUE)) {
distances.put(nextNode, distanceFromStart);
parents.put(nextNode, currNode);
queue.offer(nextNode);
}
}
}
return -1; // 如果不可达,则返回 -1
}
public List<Node> shortestPathNodes(Node start, Node end) {
List<Node> path = new ArrayList<>();
Node currNode = end;
while (!currNode.equals(start)) {
path.add(0, currNode);
currNode = getParent(currNode);
if (currNode == null) {
return null; // 如果不可达,则返回 null
}
}
path.add(0, start);
return path;
}
private Node getParent(Node node) {
for (Map.Entry<Node, Node> entry : graph.entrySet()) {
if (entry.getValue().contains(node)) {
return entry.getKey();
}
}
return null;
}
}
```
Main.java(测试代码)
```java
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Main {
public static void main(String[] args) {
Node node1 = new Node(1);
Node node2 = new Node(2);
Node node3 = new Node(3);
Node node4 = new Node(4);
Node node5 = new Node(5);
List<Edge> edges1 = new ArrayList<>();
edges1.add(new Edge(node1, node2, 2));
edges1.add(new Edge(node1, node3, 1));
List<Edge> edges
### 回答2:
在编写Java代码时,模块化和去耦合是非常重要的设计原则,可以提高代码的可维护性和可扩展性。同时,在构建和测试过程中的合理性也非常关键,可以确保代码的正确性和稳定性。
对于求解有向图节点之间最短路径及长度的问题,可以采用Dijkstra算法来实现。以下是一种可能的Java代码实现:
首先,需要定义节点类和边类:
```
class Node {
int label; // 节点标识
ArrayList<Edge> edges; // 与该节点相连的边
public Node(int label) {
this.label = label;
this.edges = new ArrayList<>();
}
public void addEdge(Edge edge) {
this.edges.add(edge);
}
}
class Edge {
Node source; // 起始节点
Node destination; // 目标节点
int weight; // 边的权重
public Edge(Node source, Node destination, int weight) {
this.source = source;
this.destination = destination;
this.weight = weight;
}
}
```
接下来,可以实现求最短路径及长度的方法:
```
public int shortestPath(Node start, Node end) {
// 初始化距离数组和最短路径数组
Map<Node, Integer> distance = new HashMap<>();
Map<Node, Node> path = new HashMap<>();
for (Node node : nodes) {
distance.put(node, Integer.MAX_VALUE);
path.put(node, null);
}
distance.put(start, 0);
// 创建优先队列,按照节点距离排序
PriorityQueue<Node> queue = new PriorityQueue<>(Comparator.comparingInt(distance::get));
queue.add(start);
while (!queue.isEmpty()) {
Node current = queue.poll();
// 遍历当前节点的所有边
for (Edge edge : current.edges) {
Node neighbor = edge.destination;
int weight = edge.weight;
// 更新最短路径和距离
if (distance.get(current) + weight < distance.get(neighbor)) {
distance.put(neighbor, distance.get(current) + weight);
path.put(neighbor, current);
// 更新优先队列
if (queue.contains(neighbor)) {
queue.remove(neighbor);
}
queue.add(neighbor);
}
}
}
// 判断终点是否可达
if (path.get(end) == null) {
return -1;
}
// 构建最短路径
List<Node> shortestPath = new ArrayList<>();
Node node = end;
while (node != null) {
shortestPath.add(0, node);
node = path.get(node);
}
return distance.get(end);
}
```
通过以上代码,我们可以求得有向图中两点之间的最短路径及长度。如果不可达,则返回-1。这样的模块化设计和去耦合能够提高代码的可读性和可维护性,同时,构建和测试过程的合理性也确保了代码的正确性和稳定性。
### 回答3:
代码模块化和去耦合是软件开发中的重要原则。通过将代码分解为多个模块,每个模块负责特定的功能,可以使代码更易于理解、维护和重用。同时,通过去耦合,模块之间的依赖关系降低,使得修改一个模块不会影响到其他模块的功能。
构建和测试过程的合理性是保证代码质量和开发效率的重要环节。在构建过程中,应该采用合适的开发环境和工具,确保代码的正确性和一致性。而测试过程则是对代码进行系统性的验证,可以通过单元测试和集成测试等方式,确保代码的功能符合预期并能正确处理各种边界情况。
针对题目中的需求,可以通过编写Java代码来解决。首先,需要定义Node和Edge两个类,分别表示图的节点和边。Node类可以包含一个属性用于保存节点的值,以及一个列表用于存储与之相连的边。Edge类可以有两个属性用于保存边的起点和终点,以及一个属性表示边的长度。
接下来,可以构建图的数据结构,通过设置每个节点的相邻节点和边的长度,来表示图的连接关系。可以使用邻接表或邻接矩阵等方式实现。
最后,通过广度优先搜索或Dijkstra算法等方式,求解两个节点之间的最短路径和长度。可以使用一个队列和一个列表来实现广度优先搜索,每次将当前节点相邻的节点加入队列中,并更新到达每个节点的最短路径和长度。如果找到目标节点,则返回最短路径和长度;如果搜索完成后仍未找到目标节点,则表示两个节点之间不可达,返回-1。
在编写代码时,可以采用模块化的方式,将图的构建、最短路径算法等功能分为不同的函数或类,以实现代码的可重用性和可维护性。并且在编写过程中,可以适时进行单元测试和集成测试,以确保代码的正确性和可靠性。
阅读全文