Clasificación topológica [algoritmo de aprendizaje]

Prefacio

2023-9-24 15:32:23

El siguiente contenido es de "[Algoritmo de aprendizaje]"
y está destinado únicamente a fines de aprendizaje y comunicación.

derechos de autor

Elimine las siguientes palabras cuando publique en otras plataformas.
Este artículo se publicó por primera vez en la plataforma CSDN.
El autor es CSDN@日星月云.
La página de inicio del blog es https://blog.csdn.net/qq_51625007
. Elimine las siguientes palabras palabras anteriores al publicar en otras plataformas.

recomendar

ninguno

clasificación topológica

Idea principal

Eso es encontrar primero el nodo con grado 0

Eliminar el borde del que se origina

Continuar buscando nodos con grado 0.

Hasta que no puedas encontrarlo

Determinar si quedan nodos

207. Plan de estudios

207. Plan de estudios

Solución 1

class Solution {
    
    
    public boolean canFinish(int numCourses, int[][] prerequisites) {
    
    
        int n=numCourses;
        HashMap<Integer,ArrayList<Integer>> map=new HashMap<>();
        for (int i = 0; i < n; i++) {
    
    
            map.putIfAbsent(i,new ArrayList<>());
        }

        for(int[] course:prerequisites){
    
    
            map.get(course[0]).add(course[1]);
        }

        return topo(map,n);

        
    }


    public boolean topo(HashMap<Integer,ArrayList<Integer>> map,int n){
    
    
        int count=0;
        Stack<Integer> stack=new Stack<>();
        for (int i = 0; i < n; i++) {
    
    
            //找到入度为0的点
            if (map.get(i).size()==0){
    
    
                stack.add(i);
            }
        }
        while (!stack.isEmpty()) {
    
    
            Integer i=stack.pop();
            for (int j = 0; j < map.size(); j++) {
    
    
                if (map.get(j).contains(i)){
    
    
                    map.get(j).remove(i);
                    if (map.get(j).size()==0){
    
    
                        stack.add(j);
                    }
                }
            }
            count++;

        }
        return count == n;
    }    
}

Solución 2

Un índice matricial en grados

una variable visitada visitada

class Solution {
    
    
    List<List<Integer>> edges;//有向图
    int [] indeg;//入度
    public boolean canFinish(int numCourses, int[][] prerequisites) {
    
    
        edges=new ArrayList<List<Integer>>();
        for(int i=0;i<numCourses;i++){
    
    
            edges.add(new ArrayList<Integer>());
        }
        indeg=new int[numCourses];
        for(int[] info:prerequisites){
    
    
            edges.get(info[1]).add(info[0]);
            indeg[info[0]]++;
        }

        //拓扑排序
        Queue<Integer> queue = new LinkedList<Integer>();
        for(int i=0;i<numCourses;i++){
    
    
            if(indeg[i]==0){
    
    
                queue.offer(i);
            }
        }
        //广度优先搜索
        int visited=0;
        while(!queue.isEmpty()){
    
    
            visited++;
            int u=queue.poll();
            for(int v:edges.get(u)){
    
    
                indeg[v]--;
                if(indeg[v]==0){
    
    
                    queue.offer(v);
                }
            }
        }

        return visited==numCourses;

    }

}

por fin

2023-9-24 15:45:02

Todos tenemos un futuro brillante

Les deseo todo lo mejor en sus exámenes de ingreso a posgrado, les deseo todo el éxito
en su trabajo, les deseo a todos lo que desean, me gusta, recopila y sigue.


Supongo que te gusta

Origin blog.csdn.net/qq_51625007/article/details/133241812
Recomendado
Clasificación