leetcode207
拓扑排序问题。
class Solution {
public:
bool canFinish(int numCourses, vector<pair<int, int>>& prerequisites) {
int Hash[];//每个节点的入度
vector<vector<int>> v(numCourses);//用于存储每个节点相邻的边
stack<int> s;//存放入度为0的节点
memset(Hash, , sizeof(Hash));
for(int i = ; i < prerequisites.size();i++){
pair<int, int>p = prerequisites[i];
int x = p.first;
int y = p.second;
cout<<"x = "<<x <<"y = "<<y<<endl;
v[x].push_back(y);
++Hash[y];
}
for(int i = ; i < numCourses; i++){
if(Hash[i] == ){
s.push(i);
}
}
while (!s.empty()) {
int cur = s.top();//找到入度为0的点
s.pop();
for(int i = ; i < prerequisites.size(); i++){
pair<int, int>p = prerequisites[i];
int x = p.first;
int y = p.second;
if(cur == x){
for(int j = ; j < v[cur].size(); j++){
--Hash[v[cur][j]];//删除以该点为起点的所有有向边
if(Hash[v[cur][j]] == )
s.push(v[cur][j]);
}
break;
}
}
}
for(int i = ; i < numCourses; i++){
if(Hash[i] != )
return false;
}
return true;
}
};
补充一个python的实现:
class Solution:
#返回True表示有环,返回False表示无环
def dfs(self,visited,memo,dic,i):
if visited[i]:
return True
if memo[i] == :
return False
elif memo[i] == :
return True
for cs in dic[i]:
visited[i] = True
bl = self.dfs(visited,memo,dic,cs)
visited[i] = False
if bl:
#当前线路中出现了环,则标记当前课程为1,返回True
memo[i] =
return True
##当前线路,已经找到最早的前置课程,没有出现"环",则标记为0,表示课程i是可以学习的
memo[i] =
return False#返回False表示无环,当前课程i,可以完成学习 def canFinish(self, numCourses: 'int', prerequisites: 'List[List[int]]') -> 'bool':
dic = {}
n = len(prerequisites)
for i in range(numCourses):
dic[i] = []
for i in range(n):
cs = prerequisites[i][]#当前课程
pre = prerequisites[i][]#前置课程
dic[cs].append(pre)
visited = [False for _ in range(numCourses)]
memo = [- for _ in range(numCourses)]
for i in range(numCourses):
#只要出现过一个有环的线路,则不能符合题目"所有课程都完成"的目标
if self.dfs(visited,memo,dic,i):
return False
return True
算法思路:深度优先遍历,判断图中是否有环。
使用两个标记数组:
visited=True表示当前“线路”上的节点已经被锁定,如果在线路遍历的过程中遇到已经被锁定的节点,那说明遇到了环。
memo表示备忘录(缓存),默认状态为-1,标记为0表示本节点不存在环,标记为1表示本节点有环,使用备忘录可加速得到查询结果。
leetcode207的更多相关文章
- [Swift]LeetCode207. 课程表 | Course Schedule
There are a total of n courses you have to take, labeled from 0 to n-1. Some courses may have prereq ...
- LeetCode207. Course Schedule
Description There are a total of n courses you have to take, labeled from 0 to n - 1. Some courses m ...
- LeetCode207 课程表
问题:课程表 现在你总共有 n 门课需要选,记为 0 到 n-1. 在选修某些课程之前需要一些先修课程. 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1] 给定 ...
- Leetcode207. Course Schedule课程表
现在你总共有 n 门课需要选,记为 0 到 n-1. 在选修某些课程之前需要一些先修课程. 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1] 给定课程总量以及它 ...
- 拓扑排序 Topological Sort
2018-05-02 16:26:07 在计算机科学领域,有向图的拓扑排序或拓扑排序是其顶点的线性排序,使得对于从顶点u到顶点v的每个有向边uv,u在排序中都在v前.例如,图形的顶点可以表示要执行的任 ...
随机推荐
- Mysql5.7实现主从复制、基于GTID的主从复制、并行复制
(一.主从复制) 一.mysql主从复制原理 mysql的默认复制方式是主从复制.Mysql内建的复制功能是构建大型,高性能应用程序的基础.将Mysql的数据分布到多个系统上去,这种分布的机制, ...
- WCF分布式服务1-核心概念
参考msdn library for WCF Windows Communication Foundation (WCF) 是用于构建面向服务的应用程序的框架. 借助 WCF,可以将数据作为异步消息从 ...
- React Native Android打包apk
按照官方的5步曲: 1.在终端里面,cd 到项目的根目录后.执行下面这行命令: keytool -genkey -v -keystore my-release-key.keystore -alias ...
- web(七)css的语法规则、注释
css的语法规则:特殊的css语法标识. !important:当使用多种方式设定标签样式时,设定样式渲染的应用优先权,声明在取值之后. .important { color: red !import ...
- JAVA高级篇(一、JVM基本概念)
一.什么是JVM VM的中文名称叫Java虚拟机,它是由软件技术模拟出计算机运行的一个虚拟的计算机. JVM也充当着一个翻译官的角色,我们编写出的Java程序,是不能够被操作系统所直接识别的,这时候J ...
- 网络编程-----IO
IO模型介绍 阻塞IO 非阻塞 多路复用 异步 IO模型比较分析 selectors 阻塞IO:之前写的所有的socket,recv,accput都是 阻塞原理: 其实多数时间多用到了等待数据那里. ...
- java实现四则运算应用(基于控制台)
项目地址:https://gitee.com/wxrqforever/object_oriented_exp1.git 一.需求分析: 一个基于控制台的四则运算系统,要能实现生成并计算含有真,假分数, ...
- 几种数据格式的处理 - Python
1. CSV数据 import csv csvfile = open('data_text.csv','rb') reader = csv.reader(csvfile) # 返回数据为列表类型 # ...
- js layer.js
var index = parent.layer.getFrameIndex(window.name); parent.layer.close(index); 关闭弹出页 全屏弹出页面 layer.o ...
- java_oop_方法1
方法 方法概念 封闭业务逻辑 提高代码复用定义类的方法 类的方法定义类的某种行为(或功能) 方法返回的数据类型 方法的名称 (方法的参数也叫形参) {方法的主体} 方法的 ...