思路:leetcode的一道题。无环的有向图可以排出一个拓扑顺序。首先将每个结点的入度求出(扫描一遍边表),如果没有入度为0的结点,则说明有环。在循环开始前,入度为0的结点表示其没有先修课程,可以看作是已排好拓扑序。循环中,每次选择一个结点,扫描其邻居结点并检查入度,如果某个邻居结点的入度为1(说明只和当前结点相邻),则将其加入拓扑序中,依次循环。对结点的搜索可以是BFS。
代码:
// leetcode207.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <vector>
#include <queue>
using std::cin;
using std::cout;
using std::endl;
using std::cerr;
using std::vector;
using std::pair;
using std::queue;
class Solution {
public:
bool canFinish(int numCourses, vector<pair<int, int>>& prerequisites) {
int size = prerequisites.size();
vector<vector<int>> pre(numCourses); //邻接链表
vector<int>