1、题目描述
输入n表示有n们课,输入一组pair,表示在上first这门课之前必须要上second这门课,问有没有合法上课顺序。
2、思路
拓扑排序。数组d用来记录没门课有几门先修课。v表示连接表,用来表示vi是哪些课的先修课。
声明集合s,用来保存当前可以上的课。把d = 0的课都存入s,一门门上s中的课,每上一门课,
都要把它的v中的课的d减1,如果这些课d为0,则加入s。统计所有上的课数,不够n,则返回false;否则返回true。
3、代码
bool canFinish(int n, vector<pair<int, int>>& p) {
int m = p.size();
vector<int>d(n,0);
vector<vector<int> > v(n);
set<int>s;
for(int i=0;i<m;i++){
d[p[i].first]++;
v[p[i].second].push_back(p[i].first);
}
for(int i=0;i<n;i++){
if(d[i]==0)
s.insert(i);
}
int cnt = 0;
while(!s.empty()){
int i = *s.begin();
s.erase(s.begin());
cnt++;
for(int j=0;j<v[i].size();j++){
d[v[i][j]]--;
if(d[v[i][j]]==0)
s.insert(v[i][j]);
}
}
if(cnt==n) return true;
else return false;
}