题意:和Course Schedule 是一样的题意,只不过这里要求出修课的顺序。
题解:还是拓扑排序。
class Solution {
public:
vector<int> findOrder(int numCourses, vector<pair<int, int>>& prerequisites) {
vector<int> ans;
bool g[numCourses+1][numCourses+1];
int d[numCourses+1];
bool vis[numCourses+1];
memset(g,false,sizeof(g));
memset(d,0,sizeof(d));
memset(vis,false,sizeof(vis));
for(int i = 0; i < prerequisites.size(); i++)
{
int u = prerequisites[i].first;
int v = prerequisites[i].second;
if(!g[v][u])
g[v][u] = true,d[u]++;
}
queue<int> q;
while(!q.empty()) q.pop();
for(int i = 0; i < numCourses; i++)
if(!d[i])
q.push(i),vis[i] = true;
while(!q.empty())
{
int now = q.front();
ans.push_back(now);
q.pop();
for(int i = 0; i < numCourses; i++)
{
if(g[now][i]) d[i]--;
if(!vis[i] && !d[i]) q.push(i),vis[i] = true;;
}
}
for(int i = 0; i < numCourses; i++)
if(d[i]) ans.clear();
return ans;
}
};