第一种图的方法:超时
struct Edge{
int to;
Edge(int x){
to = x;
}
};
struct Node{
vector<Edge> edges;
int indegree;
Node(){
indegree=0;
}
};
struct Graph{
Node * node;
int num;
Graph(int n){
node =new Node[n];
num = n;
}
void insert(const pair<int,int> & p){
node[p.first].edges.push_back(Edge(p.second));
node[p.second].indegree++;
}
~Graph(){
delete [] node;
}
};
class Solution {
public:
bool canFinish(int numCourses, vector<pair<int, int>>& prerequisites) {
Graph graph(numCourses);
for(auto item : prerequisites){
graph.insert(item);
}
bool visited[numCourses];
queue<int> q;
for(int i = 0;i < numCourses; i++){
visited[i]= false;
if(graph.node[i].indegree == 0){
q.push(i);
visited[i]= true;
}
}
while(!q.empty()){
int index = q.front();
q.pop();
for(auto item : graph.node[index].edges){
graph.node[item.to].indegree--;
}
for(int i = 0;i < numCourses; i++){
if(graph.node[i].indegree == 0){
visited[i] = true;
q.push(i);
}
}
}
for(int i = 0;i < numCourses; i++){
if(!visited[i]){
return false;
}
}
return true;
}
};
第二种方法:
class Solution {
public:
bool canFinish(int numCourses, vector<pair<int, int>>& prerequisites) {
int indegree[numCourses];
bool visited[numCourses];
queue<int> q;
unordered_map<int,vector<int>> m;
for(int i=0;i<numCourses;i++){
indegree[i]=0;
visited[i] = false;
}
for(auto item : prerequisites){
m[item.first].push_back(item.second);
indegree[item.second]++;
}
for(int i=0;i<numCourses;i++){
if(indegree[i] == 0){
q.push(i);
visited[i] = true;
}
}
while(!q.empty()){
int index = q.front();
q.pop();
// auto p = m.find(index);
for(auto item : m[index]){
indegree[item]--;
if(indegree[item] == 0){
q.push(item);
visited[item] = true;
}
}
}
for(int i=0;i<numCourses;i++){
if(!visited[i])
return false;
}
return true;
}
};
思路是拓扑排序,复杂度O(n+e)