判断给出的课程先修条件是否可能满足所有课程全部修满.....实际上我们不妨先用一个二维矩阵记录所有课程的先修关系,用一个一维数组pre记录每门课的先修课程数量....
问题的突破口在于那些没有先修课程的课(否则肯定不合理,一门都修不了)。我们用一个队列queue存储可以修的课并用count记录能修的课程数,初始queue存储的是那些没有先修课的课程....遍历queue,对于其中的每一门课查找二维矩阵找到以这门课作为先修课的课程j,j的pre就应该减1,当pre[j]为0时说明j的先修课条件被全部满足,可以将j加入queue中.....最终比较count和课程数的关系即可.....
public class Solution {
public boolean canFinish(int numCourses, int[][] prerequisites) {
int[][] rel=new int[numCourses][numCourses];
int[] preNum=new int[numCourses];
for( int i=0;i<prerequisites.length;i++ )
{
int curCourse=prerequisites[i][0];
int pre=prerequisites[i][1];
if( rel[pre][curCourse]==0 )
{
preNum[curCourse]++;
}
rel[pre][curCourse]=1;
}
int count=0;
Queue<Integer> queue=new LinkedList<Integer>();
for( int i=0;i<numCourses;i++ )
{
if( preNum[i]==0 )
{
queue.add(i);
}
}
while( !queue.isEmpty() )
{
count++;
int course=queue.peek();
queue.remove();
for( int i=0;i<numCourses;i++ )
{
if( rel[course][i]==1 )
{
preNum[i]--;
if( preNum[i]==0 )
{
queue.add(i);
}
}
}
}
return count==numCourses;
}
}