利用二维数组、Map或Graph类存储有向图,创建一个有向图,并完成如下操作:1. 输入:图的任意一个节点编号; 2. 输出:该节点的入度、出度、入度边邻居和出度边邻居的编号。
时间: 2024-03-11 20:47:26 浏览: 58
好的,我可以为您提供代码实现,以下是利用Map类存储有向图,并完成操作的Java代码示例:
```java
import java.util.*;
public class DirectedGraph {
private Map<Integer, List<Integer>> adjList;
public DirectedGraph() {
adjList = new HashMap<Integer, List<Integer>>();
}
public void addEdge(int src, int dest) {
if (!adjList.containsKey(src)) {
adjList.put(src, new ArrayList<Integer>());
}
adjList.get(src).add(dest);
}
public void printNodeInfo(int node) {
System.out.println("Node " + node + " Info:");
System.out.println("In-degree: " + getInDegree(node));
System.out.println("Out-degree: " + getOutDegree(node));
System.out.println("In-neighbor nodes: " + getInNeighbors(node));
System.out.println("Out-neighbor nodes: " + getOutNeighbors(node));
}
private int getInDegree(int node) {
int inDegree = 0;
for (Map.Entry<Integer, List<Integer>> entry : adjList.entrySet()) {
List<Integer> neighbors = entry.getValue();
if (neighbors.contains(node)) {
inDegree++;
}
}
return inDegree;
}
private int getOutDegree(int node) {
if (adjList.containsKey(node)) {
return adjList.get(node).size();
}
return 0;
}
private List<Integer> getInNeighbors(int node) {
List<Integer> inNeighbors = new ArrayList<Integer>();
for (Map.Entry<Integer, List<Integer>> entry : adjList.entrySet()) {
int currNode = entry.getKey();
List<Integer> neighbors = entry.getValue();
if (neighbors.contains(node)) {
inNeighbors.add(currNode);
}
}
return inNeighbors;
}
private List<Integer> getOutNeighbors(int node) {
if (adjList.containsKey(node)) {
return adjList.get(node);
}
return new ArrayList<Integer>();
}
public static void main(String[] args) {
DirectedGraph graph = new DirectedGraph();
graph.addEdge(1, 2);
graph.addEdge(1, 3);
graph.addEdge(2, 3);
graph.addEdge(3, 4);
graph.addEdge(4, 2);
graph.printNodeInfo(2);
}
}
```
在上述代码中,我们首先创建了一个`DirectedGraph`类,其中`adjList`变量是一个Map对象,用于存储有向图的邻接表。`addEdge`方法用于向图中添加边。`printNodeInfo`方法用于打印节点的入度、出度、入度边邻居和出度边邻居的编号。
在`getInDegree`方法中,我们遍历所有节点的邻接表,如果邻接表中包含目标节点,则目标节点的入度加1。在`getOutDegree`方法中,我们直接获取目标节点的邻接表大小即可。在`getInNeighbors`方法中,我们遍历所有节点的邻接表,如果邻接表中包含目标节点,则将当前节点加入到目标节点的入度边邻居列表中。在`getOutNeighbors`方法中,我们直接返回目标节点的邻接表即可。
在`main`方法中,我们创建了一个有向图,并对节点2进行了操作。你可以将上述代码复制到Java IDE中运行,查看结果。
阅读全文