拓扑排序 leetcode207

本文详细介绍了如何使用拓扑排序算法检测有向图中是否存在环。通过将入度为0的顶点输出并删除其所有边,重复此过程直至所有顶点被处理。若最终输出顶点数等于总顶点数,则图中无环。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

拓扑排序的思想:
1.选择入度为0的顶点,将其输出
2.将该顶点所有的边全部删除
3.如此重复上述步骤,
如果最后输出的顶点的个数等于图中顶点的个数则该图中没有环,否则该图中有环;


```java
public class Solution {
    public boolean canFinish(int numCourses, int[][]prerequisites) {        
    if (numCourses <= 0) {            
    			return false;        
    	}        
    	int[] in_degree=new int[numCourses];        
    	List<Integer>[] adj=new ArrayList[numCourses];        
    	for(int i=0;i<numCourses;i++){            
    	adj[i]=new ArrayList<>();        
    	}    
	for(int i=0;i<prerequisites.length;i++){            				
		in_degree[prerequisites[i][0]]++;            
		adj[prerequisites[i][1]].add(prerequisites[i][0]);        
	} 
	//维护一个入度为0的队列;       
	Queue<Integer> q=new LinkedList<>();        
	for(int i=0;i<numCourses;i++){            
		if(in_degree[i]==0)                
			q.add(i);        
		}             
 	int count=0;        
 	while(!q.isEmpty()){            
 		Integer top=q.poll();            
 		count++;   
 		//每次将入度为0的节点出队时,同时将该节点对应的所有的节点的入度都减1     
 		for(int i=0;i<adj[top].size();i++){                 				
 			in_degree[adj[top].get(i)]--;                				
 			if(in_degree[adj[top].get(i)]==0)							
 			{  //如果入度为0的时候就将其也入队                  
 				q.add(adj[top].get(i));                
 			}            
 		}        
 	}       
 		//最后判断得到的节点的个数是否等于课程数;
 		//如果等于的话则表明该图无环
 		if(count==numCourses)            
 			return true;        
 		else{            
 			return false;        
 			}
}}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值