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前.例如,图形的顶点可以表示要执行的任 ...
随机推荐
- angular2在ts中使用transform转换时间格式
摘要:在angular1中我们可以在控制器中像下面那样使用filter: $filter('date')(myDate, 'yyyy-MM-dd'); 但是如何在angular2中在ts中使用自定义p ...
- python基础08_set集合
关于前几次课的回顾: #!/usr/bin/env python # coding:utf-8 ## 字符串 数字 列表 元组 字典 ## 可变:列表 字典 ## 不可变:字符串, 数字, 元组 na ...
- XCode9和10编译Cordova报错toLowerCase of undefined解决方案
XCode升级到9或10后,cordova build时报错:toLowerCase of undefined... 解决方案: 修改platforms/ios/cordova/lib/list-em ...
- oracle密码过期的修改
ALTER USER 用户名 IDENTIFIED BY 密码 ;
- Css3新属性:calc()
一.前言 calc()看起来像是javascript中的一个函数,而事实上它是用在Css中的,可以用它来计算长度(宽度或高度),能够自动根据不同尺寸的屏幕自动调接数值,从而很轻松的实现自适应布局展示在 ...
- 关于attibutedText输出中文字符后的英文和数字进行分开解析的问题
上面的图应该很清楚 具体这个attibutedText 是做什么的就不说了 ,最初我查了资料发现有人和我一样的输出,把一个字符串的中英文分开打印出来是iOS关于UItextVIew和UIlabel的差 ...
- eval函数解析json数据时加上圆括号的原因
var temp = eval("(" + data + ")"); //解析json数据 json是以”{}”的方式来开始以及结束的,在JS中,“{}”会被当 ...
- Linux下截屏方法
参考百度经验 https://jingyan.baidu.com/article/48a42057c8e8dfa92525047c.html 第一种: 截屏部分画面并保存 快捷键Shift+PrtSc
- [转]keepalived简介
https://www.jianshu.com/p/b050d8861fc1 contents: 什么是Keepalived VRRP协议简介 Keepalived原理 Keepalived配置文件详 ...
- cocos2dx自定义事件类封装
GameEvent.h: #pragma once #include "cocos2d.h" USING_NS_CC; class GameEvent { public: //封装 ...