📜  如何在Java为给定数量的边生成随机无向图?(1)

📅  最后修改于: 2023-12-03 14:52:46.490000             🧑  作者: Mango

在Java中为给定数量的边生成随机无向图

生成随机无向图是一个常见的计算机科学问题,对于日常编程任务和算法研究都有重要意义。在Java中,我们可以使用随机算法来生成给定数量的边的无向图。

随机无向图生成算法

以下是一个简单的随机无向图生成算法的伪代码:

1. 创建一个空的图对象。
2. 初始化节点列表,包含图中的所有节点。
3. 创建一个空的边列表。
4. while 边列表的数量小于给定的边数:
     1. 随机选择两个节点。
     2. 如果这两个节点之间没有边,则创建一条连接它们的边,并添加到边列表中。
5. 将边列表添加到图中。
6. 返回生成的图。
Java代码实现

下面是一个使用Java编写的示例代码,用于生成给定数量的边的随机无向图。

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

class Edge {
    int source;
    int destination;
    
    public Edge(int source, int destination) {
        this.source = source;
        this.destination = destination;
    }
}

class UndirectedGraph {
    int numVertices;
    List<Edge> edges;
    
    public UndirectedGraph(int numVertices) {
        this.numVertices = numVertices;
        edges = new ArrayList<>();
    }
    
    public void addEdge(int source, int destination) {
        edges.add(new Edge(source, destination));
    }
    
    public void generateRandomGraph(int numEdges) {
        Random random = new Random();
        List<Integer> vertices = new ArrayList<>();
        for (int i = 0; i < numVertices; i++) {
            vertices.add(i);
        }
        
        while (edges.size() < numEdges) {
            int source = vertices.get(random.nextInt(numVertices));
            int destination = vertices.get(random.nextInt(numVertices));
            
            if (source != destination) {
                boolean duplicate = false;
                for (Edge edge : edges) {
                    if ((edge.source == source && edge.destination == destination) || 
                            (edge.source == destination && edge.destination == source)) {
                        duplicate = true;
                        break;
                    }
                }
                
                if (!duplicate) {
                    edges.add(new Edge(source, destination));
                }
            }
        }
    }
    
    public String toMarkdownFormat() {
        StringBuilder sb = new StringBuilder();
        
        sb.append("| Source | Destination |\n");
        sb.append("| ------ | ----------- |\n");
        
        for (Edge edge : edges) {
            sb.append("| ").append(edge.source).append(" | ").append(edge.destination).append(" |\n");
        }
        
        return sb.toString();
    }
}

public class RandomGraphGenerator {
    public static void main(String[] args) {
        int numVertices = 10;
        int numEdges = 15;
        
        UndirectedGraph graph = new UndirectedGraph(numVertices);
        graph.generateRandomGraph(numEdges);

        String markdown = graph.toMarkdownFormat();
        System.out.println(markdown);
    }
}
运行结果示例

以下是生成包含10个节点和15条边的随机无向图的运行结果示例的Markdown格式:

| Source | Destination | | ------ | ----------- | | 1 | 3 | | 0 | 7 | | 4 | 7 | | 1 | 4 | | 2 | 5 | | 5 | 6 | | 1 | 6 | | 0 | 2 | | 4 | 5 | | 3 | 7 | | 2 | 4 | | 1 | 9 | | 2 | 8 | | 3 | 9 | | 3 | 4 |

该结果表示了图中每条边连接的两个节点的编号。

请根据自己的需求修改 numVerticesnumEdges 的值,并运行以上代码生成不同规模的随机无向图。