拓扑排序问题。

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的更多相关文章

  1. [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 ...

  2. LeetCode207. Course Schedule

    Description There are a total of n courses you have to take, labeled from 0 to n - 1. Some courses m ...

  3. LeetCode207 课程表

    问题:课程表 现在你总共有 n 门课需要选,记为 0 到 n-1. 在选修某些课程之前需要一些先修课程. 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1] 给定 ...

  4. Leetcode207. Course Schedule课程表

    现在你总共有 n 门课需要选,记为 0 到 n-1. 在选修某些课程之前需要一些先修课程. 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1] 给定课程总量以及它 ...

  5. 拓扑排序 Topological Sort

    2018-05-02 16:26:07 在计算机科学领域,有向图的拓扑排序或拓扑排序是其顶点的线性排序,使得对于从顶点u到顶点v的每个有向边uv,u在排序中都在v前.例如,图形的顶点可以表示要执行的任 ...

随机推荐

  1. POJ 3254 Corn Fields (状压入门)

    Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ M≤ 12; 1 ≤ N ≤ 12) ...

  2. web roadmap

  3. python基础11_函数作用域_global_递归

    看到了一个16进制转换的小知识点,就验证了一下运行结果. #!/usr/bin/env python # coding:utf-8 # 看到了16进制转换的问题.顺便验证一下. a = 255 b = ...

  4. wpf 控件简单介绍

  5. linux rpm方式安装mysql

    01.搜索 mysql linux 网盘地址    http://pan.baidu.com/s/1qYOC6cs 02.把下载好的mysql 使用 xftp传到 linux中 software 文件 ...

  6. 神州数码广域网PPP封装PAP认证配置

    实验要求:熟练掌握PAP认证配置(单向.双向) 拓扑如下: 单向 R1(验证方) enable 进入特权模式 config 进入全局模式  hostname R1 修改名称 interface s0/ ...

  7. git安装,windows下git bash默认目录更改

    最早Git是在Linux上开发的,很长一段时间内,Git也只能在Linux和Unix系统上跑.不过,慢慢地有人把它移植到了Windows上.现在,Git可以在Linux.Unix.Mac和Window ...

  8. gitlab修改默认端口

    部署gitlab的时候,一启动,发现80和8080端口已经被占用,无奈,只得先将监听80端口的nginx和监听8080端口的jenkins停止.这会儿有空,琢磨一下如何修改gitlab的默认端口. 修 ...

  9. python爬虫解析页面数据的三种方式

    re模块 re.S表示匹配单行 re.M表示匹配多行 使用re模块提取图片url,下载所有糗事百科中的图片 普通版 import requests import re import os if not ...

  10. Python pip源更改

    将pip源设置为阿里源 windows 打开文件资源管理器(文件夹地址中) 地址栏上面输入 %appdata% 在这里面新建一个文件夹pip 在pip文件夹里面新建一个文件叫做 pip.ini,内容如 ...