思路:拓扑排序,判断无环
1.建立二维数组record[ ][ ] ,记录每个顶点的相邻点
2.Hash[ ]记录每个顶点的入度
3.将入度=0的点进栈
4.每次出栈一个点x,把record[x]行所有点的入度-1,产生入度=0的点则进栈
5.重复4直至栈为空
6.遍历Hash[ ],若每个元素都是0,则无环,否则有环。
tip:因为要自己建模,所以建立二维数组记录比较方便(这里在邻接矩阵的基础上作了修改,只记录可达点,从而减少时间消耗),不建议写邻接表,建立过程比较繁琐。
代码:
class Solution {
public:
bool canFinish(int numCourses, vector<pair<int, int>>& prerequisites) {
vector<vector<int>> record(numCourses);//存储每个节点相邻的边
int Hash[10010];//记录入度
memset(Hash,0,sizeof(Hash));
//初始化二维数组,记录可达关系
for(int i=0;i<prerequisites.size();i++)
{
pair<int,int> tmp=prerequisites[i];
int x=tmp.first;
int y=tmp.second;
record[y].push_back(x);
Hash[x]++;
}
//0度入栈
stack<int> s;
for(int i=0;i<numCourses;i++)
{
if(Hash[i]==0) s.push(i);
}
//图的拓扑排序
while(!s.empty())
{
int tmp=s.top();
s.pop();
for(int i=0;i<record[tmp].size();i++)
{
int k=record[tmp][i];
Hash[k]--;
if(Hash[k]==0) s.push(k);
}
}
for(int i=0;i<numCourses;i++)
{
if(Hash[i]!=0) return false;
}
return true;
}
};