Входная и выходная помощь в топологической сортировке
public static void main (String [] args){ Scanner sc= new Scanner (System.in); System.out.println("Enter no. of Islands"); int n= sc.nextInt(); Graph g = new Graph (n); System.out.println("Enter no. of one-way bridges"); int m= sc.nextInt(); System.out.println("Enter no. of island you want to be intially on"); int r= sc.nextInt(); try{ for (int i=0; i<m;i++){ System.out.println("This one-way bridge connects between"); int u = sc.nextInt(); int v = sc.nextInt(); if(u == v || u>n || v>n){ throw new Bounds("");} else{ g.addEgde(u-1, v-1);} } g.topoSort();} catch(IndexOutOfBoundsException e){ System.out.println("Please enter a valid input!"); } catch(Bounds e){ System.out.println("Please enter a valid input!"); } } public static class Bounds extends Exception{ public Bounds (String message){ super(message); }} static class Graph { int V; LinkedList<Integer>[] adjList; Graph(int V) { this.V = V; adjList = new LinkedList[V]; for (int i = 0; i < V; i++) { adjList[i] = new LinkedList<>(); } } public void addEgde(int u, int v) { adjList[u].addFirst(v); } public void topoSort() { boolean[] visited = new boolean[V]; stack stack = new stack(); for (int i = 0; i < V; i++) { if (!visited[i]) { topoSortRE(i, visited, stack); } } System.out.println("Topological Sort: "); int size = stack.size(); for (int i = 0; i <size ; i++) { System.out.print(stack.pop()+ 1 + " "); } } public void topoSortRE(int s, boolean[] visited, stack stack) { visited[s] = true; for (int i = 0; i < adjList[s].size(); i++) { int vertex = adjList[s].get(i); if (!visited[vertex]) topoSortRE(vertex, visited, stack); } stack.push(s); }}}
Что я уже пробовал:
The following code is an attempt to solve the following problem: There are many islands that are connected by one-way bridges, that is, if a bridge connects islands a and b, then you can only use the bridge to go from a to b but you cannot travel back by using the same. If you are on island a, then you select (uniformly and randomly) one of the islands that are directly reachable from a through the one-way bridge and move to that island. You are stuck on an island if you cannot move any further. It is guaranteed that if there is a directed path from one island to the second there is no path that leads from the second back to the first. In other words the formed graph is a Directed Acyclic Graph. Find the island that you are most likely to get stuck on; that is the island that you can possibly reach with the maximum number of paths from all other islands.
Формат ввода: первая строка: три целых числа n (число островов), m (число односторонних мостов) и r (индекс острова, на котором вы изначально находитесь) следующие m строк: два целых числа ui и vi, представляющих односторонний мост от острова ui до vi. Формат вывода: выведите индекс острова, на котором вы, скорее всего, застрянете. Если островов несколько, то выведите их в порядке возрастания индексов (значения через пробел в одной строке). Входной сигнал образца
5, 7, 1
(1, 2)
(1, 3)
(1, 4)
(1, 5)
(2, 4)
(2, 5)
(3, 4)
Пример вывода
4
Я написал код для топологической сортировки графика, но у меня возникли проблемы с тем, как сделать вход r внутренним островом, а также как сделать выход наиболее вероятным островом, на котором можно застрять. Я знаю, что остров, на котором я, скорее всего, застряну, - это остров, на котором есть больше всего indegrees и нет outdegrees, но не знаю, как это реализовать.
karma2447
Ваша идея верна,
1. в случае, если нет привязки памяти, и вы уже знаете номер острова, поэтому вы можете создать массив этой длины. arrayThatStoresOutDegree[#острова]
2. Когда вы ограничены пространством, добавьте остров в список вершин, что означает, что ваш граф будет выглядеть, и если он присутствует, просто увеличьте внешние связи.
Лучший способ сделать это-карта<#island, ouboundList>.
Кроме того, чтобы ответить на ваш вопрос, используйте метод add, а не
public void addEgde(int u, int v) {
adjList[у].добавьте(V);
}