Как создать произвольно направленный ациклический граф для заданного числа ребер в Java?
Направленный ациклический граф - это ориентированный граф без ориентированных циклов. В ориентированном графе ребра соединены так, что каждое ребро идет только в одну сторону. Направленный ациклический граф означает, что граф не является циклическим или что невозможно начать с одной точки на графике и пройти через весь граф. Каждое ребро направлено от более раннего ребра к более позднему.
Чтобы сгенерировать случайный DAG (направленный ациклический граф) для заданного количества ребер.
Примеры:
Вход: Введите количество кромок: 20 Выход: Сгенерированный случайный график: 1 -> {Изолированная вершина! } 2 -> {Изолированная вершина! } 3 -> {18} 4 -> {5} 5 -> {16 8} 6 -> {Изолированная вершина! } 7 -> {Изолированная вершина! } 8 -> {} 9 -> {Изолированная вершина! } 10 -> {Изолированная вершина! } 11 -> {Изолированная вершина! } 12 -> {} 13 -> {Изолированная вершина! } 14 -> {18} 15 -> {Изолированная вершина! } 16 -> {} 17 -> {19 3 5 4} 18 -> {} 19 -> {} 20 -> {12} Вход: Введите количество кромок: 30 Выход: Сгенерированный случайный график: 1 -> {12 8 7 16 5 11} 2 -> {16} 3 -> {} 4 -> {10} 5 -> {} 6 -> {7} 7 -> {5} 8 -> {7 12 20} 9 -> {16 12} 10 -> {3} 11 -> {17 14} 12 -> {4 3} 13 -> {12 5} 14 -> {15 17} 15 -> {} 16 -> {20} 17 -> {20 13} 18 -> {} 19 -> {12 11} 20 -> {18}
Подход:
- Введите количество ребер для случайного Направленного ациклического графа.
- Постройте соединение между двумя случайными вершинами и проверьте, генерируется ли какой-либо цикл из-за этого ребра.
- Если какой-либо цикл найден, это ребро отбрасывается и снова генерируется случайная пара вершин.
Implementation:
Java
// Java program to Generate a Random Directed // Acyclic Graph for a Given Number of Edges import java.io.*; import java.util.*; import java.util.Random; public class RandomDAG { // The maximum number of vertex for the random graph static int maxVertex = 20 ; // Function to check for cycle, upon addition of a new // edge in the graph public static boolean checkAcyclic( int [][] edge, int ed, boolean [] check, int v) { int i; boolean value; // If the current vertex is visited already, then // the graph contains cycle if (check[v] == true ) return false ; else { check[v] = true ; // For each vertex, go for all the vertex // connected to it for (i = ed; i >= 0 ; i--) { if (edge[i][ 0 ] == v) return checkAcyclic(edge, ed, check, edge[i][ 1 ]); } } // In case, if the path ends then reassign the // vertexes visited in that path to false again check[v] = false ; if (i == 0 ) return true ; return true ; } // Function to generate random graph public static void generateRandomGraphs( int e) { int i = 0 , j = 0 , count = 0 ; int [][] edge = new int [e][ 2 ]; boolean [] check = new boolean [ 21 ]; Random rand = new Random(); // Build a connection between two random vertex while (i < e) { edge[i][ 0 ] = rand.nextInt(maxVertex) + 1 ; edge[i][ 1 ] = rand.nextInt(maxVertex) + 1 ; for (j = 1 ; j <= 20 ; j++) check[j] = false ; if (checkAcyclic(edge, i, check, edge[i][ 0 ]) == true ) i++; // Check for cycle and if found discard this // edge and generate random vertex pair again } System.out.println( "The Generated Random Graph is :" ); // Print the Graph for (i = 0 ; i < maxVertex; i++) { count = 0 ; System.out.print((i + 1 ) + " -> { " ); for (j = 0 ; j < e; j++) { if (edge[j][ 0 ] == i + 1 ) { System.out.print(edge[j][ 1 ] + " " ); count++; } else if (edge[j][ 1 ] == i + 1 ) { count++; } else if (j == e - 1 && count == 0 ) System.out.print( "Isolated Vertex!" ); } System.out.print( " }
" ); } } public static void main(String args[]) throws Exception { int e = 4 ; System.out.println( "Enter the number of Edges :" + e); // Function to generate a Random Directed Acyclic // Graph generateRandomGraphs(e); } } |
Enter the number of Edges :4 The Generated Random Graph is : 1 -> { Isolated Vertex! } 2 -> { 10 } 3 -> { } 4 -> { Isolated Vertex! } 5 -> { } 6 -> { 11 } 7 -> { Isolated Vertex! } 8 -> { Isolated Vertex! } 9 -> { Isolated Vertex! } 10 -> { 5 } 11 -> { } 12 -> { Isolated Vertex! } 13 -> { Isolated Vertex! } 14 -> { Isolated Vertex! } 15 -> { 3 } 16 -> { Isolated Vertex! } 17 -> { Isolated Vertex! } 18 -> { Isolated Vertex! } 19 -> { Isolated Vertex! } 20 -> { Isolated Vertex! }
Вниманию читателя! Не переставай учиться сейчас. Ознакомьтесь со всеми важными концепциями Java Foundation и коллекций с помощью курса "Основы Java и Java Collections" по доступной для студентов цене и будьте готовы к работе в отрасли. Чтобы завершить подготовку от изучения языка к DS Algo и многому другому, см. Полный курс подготовки к собеседованию .