Programa de cursos II de LeetCode210

Descripción del Título:

Ahora tiene un total de n cursos para elegir, denotados como 0 a n-1.
Se requieren algunos cursos de prerrequisito antes de tomar ciertos cursos. Por ejemplo, si desea estudiar el curso 0, primero debe completar el curso 1. Usamos una coincidencia para representarlos: [0,1]
Dado el número total de cursos y sus requisitos previos, devuelva el estudio que organizó para completar todos orden de los cursos.
Puede haber varios pedidos correctos, solo necesita devolver uno. Si es imposible completar todos los cursos, devuelva una matriz vacía.

Ejemplo 1:

输入: 2, [[1,0]] 
输出: [0,1]
解释: 总共有 2 门课程。要学习课程 1,你需要先完成课程 0。因此,正确的课程顺序为 [0,1]

Ejemplo 2:

输入: 4, [[1,0],[2,0],[3,1],[3,2]]
输出: [0,1,2,3] or [0,2,1,3]
解释: 总共有 4 门课程。要学习课程 3,你应该先完成课程 1 和课程 2。并且课程 1 和课程 2 都应该排在课程 0 之后。
     因此,一个正确的课程顺序是 [0,1,2,3] 。另一个正确的排序是 [0,2,1,3]

Descripción:

1. El requisito previo para la entrada es el gráfico representado por la lista de bordes, no la matriz de adyacencia. Para obtener más información, consulte la notación del diagrama.
2. Puede asumir que no hay bordes duplicados en las condiciones previas ingresadas.

inmediato:

1. Este problema es equivalente a encontrar si existe un ciclo en una gráfica dirigida. Si hay un bucle, no hay clasificación topológica, por lo que es imposible seleccionar todos los cursos para el aprendizaje.
2. Clasificación topológica a través de DFS: un video tutorial maravilloso sobre Coursera (21 minutos), que presenta los conceptos básicos de la clasificación topológica.
3. La clasificación topológica también se puede realizar a través de BFS.

No hace falta decir que la idea de resolver problemas es una clasificación topológica.

Código AC:

int* findOrder(int numCourses, int** prerequisites, int prerequisitesSize, int* prerequisitesColSize, int* returnSize){
    
    
    int a[200001] = {
    
    0};
    int i,j, t;
    for (i = 0; i < numCourses; i++) {
    
    
        a[i] = 0;
    }
    //记录所有点的入度
    for (i = 0; i < prerequisitesSize; i++) {
    
    
        a[prerequisites[i][0]]++;   
    }
    
    //返回的数组
    int * b = (int *)malloc(sizeof(int) * numCourses);
    int top = 0;
    //入度为0的点放入返回数组中
    for (i = 0; i < numCourses; i++) {
    
    
        if(0 == a[i]) {
    
    
            b[top++] = i;
        }
    }

    //处理入度不为0的点
    for (i= 0; i< numCourses; i++) {
    
    
        t = 0;
        for (j = 0; j < prerequisitesSize; j++) {
    
    
            if (prerequisites[j][0] != -1 &&
                a[prerequisites[j][0]] > 0 && 
                a[prerequisites[j][1]] == 0) {
    
    
                    a[prerequisites[j][0]]--;
                    if (0 == a[prerequisites[j][0]]) {
    
    
                        b[top++] = prerequisites[j][0];
                    }
                    prerequisites[j][0] = -1;
                }
                t = 1;
        }
        if (t == 0) {
    
    
            break;
        }
    }
    if (numCourses != top) {
    
    
        *returnSize = 0;
    } else {
    
    
        *returnSize = numCourses;
    }
    return b;
}

Supongo que te gusta

Origin blog.csdn.net/weixin_44925547/article/details/106401534
Recomendado
Clasificación