当前位置:网站首页>leetcode207.课程表(判断有向图是否有环)
leetcode207.课程表(判断有向图是否有环)
2022-07-30 12:26:00 【深海里的鱼(・ω<)*】
方法一:拓扑排序
class Solution {
public:
vector<vector<int>> get_adj_list(int numCourses,vector<vector<int>> &prerequisites){
//获得图的邻接表
vector<vector<int>> graph(numCourses);
for(auto &e:prerequisites){
graph[e[0]].push_back(e[1]);
}
return graph;
}
bool topo_sort(vector<vector<int>> &graph){
//拓扑排序判断是否有环
int cnt=0;//拓扑序列中的顶点个数
int num_v=graph.size();//图中顶点个数
vector<int> deg(num_v);//各个顶点的度
stack<int> st;//存入度为0的顶点
//计算各个顶点的度
for(int i=0;i<num_v;i++){
for(auto &v:graph[i]){
deg[v]++;
}
}
//将入度为0的顶点入栈
for(int i=0;i<deg.size();i++){
if(deg[i]==0){
st.push(i);
}
}
while(!st.empty()){
int v=st.top(); //顶点v
st.pop();
cnt++;
for(auto &i:graph[v]){
//去掉顶点v看看是否会产生度为0的顶点
deg[i]--;
if(deg[i]==0){
st.push(i);
}
}
}
if(cnt<num_v){
return false;
}
else{
return true;
}
}
bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
auto adj_list=get_adj_list(numCourses,prerequisites);
return topo_sort(adj_list);
}
};
方法二:dfs深搜
class Solution {
public:
vector<vector<int>> get_adj_list(int numCourses,vector<vector<int>> &prerequisites){
//获得图的邻接表
vector<vector<int>> graph(numCourses);
for(auto &e:prerequisites){
graph[e[0]].push_back(e[1]);
}
return graph;
}
void dfs(vector<vector<int>> &graph,int u,vector<int> &vis,vector<int> &in_dfs,bool &loop){
if(loop){
//检测到环
return ;
}
in_dfs[u]=1;
vis[u]=1;
for(auto &v:graph[u]){
if(in_dfs[v]){
//如果这个顶点在本次dfs中
loop=true;
return ;
}
if(!vis[v]){
//如果这个顶点还未访问过
dfs(graph,v,vis,in_dfs,loop);
}
}
in_dfs[u]=0;
}
bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
auto graph=get_adj_list(numCourses,prerequisites);
vector<int> vis(numCourses);
vector<int> in_dfs(numCourses);
bool loop=false;
for(int i=0;i<numCourses;i++){
if(!vis[i]){
dfs(graph,i,vis,in_dfs,loop);
if(loop){
break;
}
}
}
return !loop;
}
};
边栏推荐
- Zhou Hongyi: Microsoft copied the 360 security model and became the largest security company in the United States
- Vivado安装后添加器件库
- 13-GuliMall 基础篇总结
- js 构造函数 return 非空对象,其实例化的对象在原型上的差异
- 第42讲:Scala中泛型类、泛型函数、泛型在Spark中的广泛应用
- 物理服务器与虚拟机:主要区别和相似之处
- C# 时间戳与时间的互相转换
- CMake library search function does not search LD_LIBRARY_PATH
- 结合实战,浅析GB/T28181(三)——实况点播
- RTSP/Onvif协议视频平台EasyNVR服务一键升级功能的使用教程
猜你喜欢
【Kaggle:UW-Madison GI Tract Image Segmentation】肠胃分割比赛:赛后复盘+数据再理解
刷屏了!!!
Mysql索引结构
关于香港高防IP需要关注的几个问题
OpenHarmony环境搭建报错: ImportError: cannot import name ‘VERSION‘ from ‘hb.__main__‘
Beijing, Shanghai and Guangzhou offline events丨The most unmissable technology gatherings at the end of the year are all gathered
概率论的学习整理--番外1:可重复且无次序的计数公式C(n+k-1,k) 的例题 : 同时丢3个骰子,会有多少种情况?答案不是216而是56!
和数集团:让智慧城市更智慧,让现实生活更美好
北上广线下活动丨年底最不可错过的技术聚会都齐了
New:WebKitX ActiveX :::Crack
随机推荐
Rust from entry to proficient 02-installation
忆联:激活数据要素价值潜能,释放SAS SSD创新红利
湖仓一体电商项目(一):项目背景和架构介绍
Xms Xmx PermSize MaxPermSize 区别
Scala基础:数组(Array)、映射(Map)、元组(Tuple)、集合(List)
unity对象池(学习)
京东二面痛遭中间件虐杀,30天学透这套中间件小册,挺进阿里
datax enables hana support and dolphinscheduler enables datax tasks
云主机上的MongoDB被威胁,开启AUTH认证
第42讲:Scala中泛型类、泛型函数、泛型在Spark中的广泛应用
力扣——15. 三数之和
C# 时间戳与时间的互相转换
历时两月,终拿字节跳动offer,算法面试题分享「带答案」
Homework 7.29 correlation function directory and file attributes related functions
和数集团:让智慧城市更智慧,让现实生活更美好
grep时排除指定的文件和目录
saltstack学习1入门基础
[BJDCTF2020]Cookie is so stable-1|SSTI注入
Jackson 的JAR包冲突问题
js 构造函数 return 非空对象,其实例化的对象在原型上的差异