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前.例如,图形的顶点可以表示要执行的任 ...
随机推荐
- Codeforces Round #244 (Div. 2) C. Checkposts (tarjan 强连通分量)
题目:http://codeforces.com/problemset/problem/427/C 题意:给你n座城市,m条有向道路,然后有一个机制,你在某一个城市设置检查点,那么被设置的检查点受保护 ...
- 2017-9-3模拟赛T2 取数(win)
题目 题解 做法1: 直接暴力枚举每个数是否被选出,计算平均数-中位数,并与当前答案进行比较.复杂度O(2^n),能过60%的数据. 做法2: 将每个数排序后枚举中位数. 首先,取奇数个数一定更优.容 ...
- JS的小判断
// 0 if(undefined) { console.log('1'); } else { console.log('0'); } // 0 if(null) { console.log('1') ...
- 设计一款相册APP,代替系统自带的相册功能,列举主要功能
分析:先分析原生相册的不足,用户需求痛点,然后描述下界面设计,并说明为什么用户要使用你的产品. iOS系统手机,自带的相机有基础的拍照,基础的美颜效果.除了本地存储,还有icloud可以存 ...
- HTML <form> action 属性
当提交表单时,发送表单数据到名为 "demo_form.html" 的文件(处理输入): <form action="demo_form.html" me ...
- 网络编程 多线程/socketserver模块/ threading.local
线程:进程中负责程序执行的执行单元. 多线程:在1个进程中存在多个线程. 进程只是用来把资源集中在一起,而线程才是cpu上的执行单位. 每个进程都会默认有一个控制线程也叫作主线程. 进程之间是竞争关系 ...
- HBuilder设置沉浸式状态栏显示效果
1:在[manifest.json]文件中,在[plus-->distribute--> apple]下加上[ "UIReserveStatusbarOffset":f ...
- 《Linux内核原理与分析》第六周作业
课本:第五章 系统调用的三层机制(下) 中断向量0x80和system_call中断服务程序入口的关系 0x80对应着system_call中断服务程序入口,在start_kernel函数中调用了tr ...
- 用virtualenv建立独立虚拟环境 批量导入模块信息
pip3 install virtualenv mkdir env/env1 source bin/activate pip3 freeze >requirements.txt or pipre ...
- IETF和W3C的区别
国际互联网协会ISOC和万维网联盟W3C是互联网领域内两大国际协会组织,ISOC旗下IETF机构与W3C是互联网行业内两大标准组织.不可否认「IETF和W3C都是优秀的组织,它们从事着一种使事情按程序 ...