DFS
#include <stdio.h>
#include <stack>
#include <iostream>
#include <time.h>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
int* c=new int[5000];
bool solve(int u, vector<vector<int>>& prerequisites) {
if (c[u] == -1)
{
return false;
}
if (c[u] == 1)
{
c[u] = 1;
return true;
}
c[u] = -1;
for (int i = 0; i < prerequisites.size(); i++) {
if (prerequisites[i][0] == u) {
if (!solve(prerequisites[i][1], prerequisites))
return false;
}
}
c[u] = 1;
return true;
}
bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
memset(c, 0, 1000);
for (int i = 0; i < numCourses; i++) {
if (c[i] == 0) {
if (!solve(i, prerequisites))return false;
}
}
return true;
}
int main(void) {
vector<vector<int>> prerequisites = { {1,0},{2,0},{3,1},{3,2},{1,3} };
bool t= canFinish(4, prerequisites);
cout << t;
system("pause");
}
BFS
#include <stdio.h>
#include <stack>
#include <iostream>
#include <time.h>
#include <vector>
#include <string>
#include <queue>
#include <algorithm>
using namespace std;
queue<int> q;
int b[5000];
void ss(int numCourses,vector<vector<int>>& prerequisites) {
for (int i = 0; i < prerequisites.size(); i++) {
b[prerequisites[i][1]] += 1;
}
}
void solve(int u, vector<vector<int>>& prerequisites) {
bool t = false;
q.pop();
for (int i = 0; i < prerequisites.size(); i++) {
if (prerequisites[i][0] == u) {
b[prerequisites[i][1]]--;
if (b[prerequisites[i][1]] == 0) {
q.push(prerequisites[i][1]);
}
}
}
}
bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
memset(b, 0, 5000);
ss(numCourses,prerequisites);
int t = numCourses;
for (int i = 0; i < numCourses; i++) {
if (b[i] == 0)
{
q.push(i);
}
}
while (!q.empty()) {
solve(q.front(), prerequisites);
t--;
}
return t==0?true:false;
}
int main(void) {
vector<vector<int>> prerequisites = { {1,0},{2,0},{3,1},{3,2},{1,3} };
bool t= canFinish(4, prerequisites);
cout << t;
system("pause");
}