[LeetCode] учебный план II

[Вопрос] Теперь вы должны выбрать ХОД в общей сложности п, обозначаемый 0 до п-1.
Нужны некоторые курсы Advanced Placement перед выборным наверняка. Например, вы хотите изучать курсы 0, вам необходимо заполнить Урок 1, мы используем спичку , чтобы представить их: [0,1]
к общей сумме с учетом курсов и их предпосылок, вы узнаете , чтобы вернуться к завершению всех курсов , запланированных заказ.
Там может быть несколько в правильном порядке, до тех пор , как вы возвращаетесь к одному виду его. Если это невозможно , чтобы завершить все курсы, он возвращает пустой массив.

Пример 1 : 
Входной сигнал: 2 , [[ 1 , 0 ]] 
Выход: [ 0 , 1 ] 
Пояснение: В общей сложности 2 курсов. Для изучения курсов 1 , вам необходимо пройти курс 0 . Таким образом, правильная последовательность курса [ 0 , 1 ]. 

Пример 2 : 
Входной сигнал: 4 , [[ 1 , 0 ], [ 2 , 0 ], [ 3 , 1 ], [ 3 , 2 ]] 
Выход: [ 0 , 1 , 2 ,3 ] или [ 0 , 2 , 1 , 3 ]

Объяснение: Есть четыре курса. Чтобы узнать Урок 3, вы должны завершить курс 1 и 2 курса. 1 и 2 курсы и курсы должны быть ранжированы после курса 0.
Таким образом, правильная последовательность курса [0,1,2,3]. Другой тип является правильным [0,2,1,3].
Описание:
Предпосылки ввод модель представлена в списке края, а не матрицы смежности. Пожалуйста , обратитесь к рисунку представления.
Можно предположить , что предпосылки не являются дубликатом бокового входа.

[Мышление]

Обзор топологической сортировки, LeetCode 207 по сравнению с предыдущей темой, но эта тема должна записывать последовательность обучения для каждого курса. На самом деле, каждый раз, когда требуется найти топологический рода нулевого порядка, который вдавливается в каждом узле в очередях, так что массив узлов в разрешении.

Но можно выучить этот приказ никогда не существовало, так что нам нужно посчитать количество записей, если длина разрешения и сосчитать то же самое, он возвращает Рез массива, в противном случае он возвращает пустой массив.

класс Решение {
 общественный : 
    вектор < INT > findOrder ( INT numCourses, вектор <вектор < ИНТ >> & предпосылками) { 
        карта < ИНТ , набор < ИНТ >> adjects; 
        вектор < INT > (полустепень заход numCourses, 0 );
        для (авто и края: предпосылки) {
             Int а = край [ 0 ];
            INT б = ребро [ 1 ]; 
            adjects [Ь] .Вставьте (а);
            полустепень захода [а] ++  ;
        } 
        очереди < INT > TODO; 
        вектор < ИНТ > Рез;
        для ( INT I = 0 ; я <numCourses; я ++ ) {
             если (! todo.push (я) полустепень захода [я]); 
        } 
        INT кол = 0 ;
        в то время как (! todo.empty ()) { 
            кол ++ ;
            INT v = todo.front (); 
            todo.pop (); 
            res.push_back (v);
            для  (авто прил: adjects [v]) {
                полустепени захода [ADJ] - ;
                если (! полустепень захода [ADJ]) todo.push (прил); 
            } 
        } 
        Если (res.size () == numCourses)   возвращение Рез;
        еще  возвращение {}; 
    } 
};

рекомендация

отwww.cnblogs.com/zhudingtop/p/11707244.html