imabadjoke Ответов: 0

Входная и выходная помощь в топологической сортировке


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);
}

0 Ответов