博客
关于我
【Lintcode】1366. Directed Graph Loop
阅读量:200 次
发布时间:2019-02-28

本文共 2171 字,大约阅读时间需要 7 分钟。

题目地址:

给定一个有向图,判断其是否有环。图有 n n n个顶点,每个顶点的标号为 1 ∼ n 1\sim n 1n

思路是DFS,先用邻接表建图,然后进行DFS。用一个数组标记每个顶点的访问状态,每次从一个顶点DFS的时候,标记为 0 0 0的顶点表示当前这次DFS经过的顶点,标记为 − 1 -1 1的表示从未访问过的顶点,标记为 1 1 1的表示本次DFS全部结束后已经访问过的顶点(包括之前DFS访问过的顶点)。如果在某次从一个顶点出发的时候,发现某个邻接点标记为了 0 0 0,则说明有环;如果某个邻接点标记为 − 1 -1 1则对其进行DFS;回溯之前要把遍历过的顶点都标记为 1 1 1。代码如下:

import java.util.*;public class Solution {       /**     * @param start: The start points set     * @param end:   The end points set     * @return: Return if the graph is cyclic     */    public boolean isCyclicGraph(int[] start, int[] end) {           // Write your code here        if (start == null || start.length == 0) {               return false;        }        // 算一下一共多少个顶点        int n = 0;        for (int i = 0; i < start.length; i++) {               n = Math.max(n, start[i]);            n = Math.max(n, end[i]);        }        // 用邻接表建图        Map
> graph = buildGraph(start, end); // 先把所有顶点都标记为未访问 int[] visited = new int[n + 1]; Arrays.fill(visited, -1); for (int i = 1; i <= n; i++) { // 如果标号为i的顶点未访问,则对其进行DFS if (visited[i] == -1 && dfs(graph, i, visited)) { return true; } } return false; } // 从cur开始进行DFS,返回是否发现了环 private boolean dfs(Map
> graph, int cur, int[] visited) { visited[cur] = 0; List
nexts = graph.get(cur); if (nexts != null) { for (int next : graph.get(cur)) { if (visited[next] == 0) { return true; } if (visited[next] == -1 && dfs(graph, next, visited)) { return true; } } } visited[cur] = 1; return false; } private Map
> buildGraph(int[] start, int[] end) { Map
> graph = new HashMap<>(); for (int i = 0; i < start.length; i++) { graph.putIfAbsent(start[i], new ArrayList<>()); graph.get(start[i]).add(end[i]); } return graph; }}

时空复杂度 O ( V + E ) O(V+E) O(V+E)

转载地址:http://bhds.baihongyu.com/

你可能感兴趣的文章
MySql中mvcc学习记录
查看>>
mysql中null和空字符串的区别与问题!
查看>>
MySQL中ON DUPLICATE KEY UPDATE的介绍与使用、批量更新、存在即更新不存在则插入
查看>>
MYSQL中TINYINT的取值范围
查看>>
MySQL中UPDATE语句的神奇技巧,让你操作数据库如虎添翼!
查看>>
Mysql中varchar类型数字排序不对踩坑记录
查看>>
MySQL中一条SQL语句到底是如何执行的呢?
查看>>
MySQL中你必须知道的10件事,1.5万字!
查看>>
MySQL中使用IN()查询到底走不走索引?
查看>>
Mysql中使用存储过程插入decimal和时间数据递增的模拟数据
查看>>
MySql中关于geometry类型的数据_空的时候如何插入处理_需用null_空字符串插入会报错_Cannot get geometry object from dat---MySql工作笔记003
查看>>
mysql中出现Incorrect DECIMAL value: '0' for column '' at row -1错误解决方案
查看>>
mysql中出现Unit mysql.service could not be found 的解决方法
查看>>
mysql中出现update-alternatives: 错误: 候选项路径 /etc/mysql/mysql.cnf 不存在 dpkg: 处理软件包 mysql-server-8.0的解决方法(全)
查看>>
Mysql中各类锁的机制图文详细解析(全)
查看>>
MySQL中地理位置数据扩展geometry的使用心得
查看>>
Mysql中存储引擎简介、修改、查询、选择
查看>>
Mysql中存储过程、存储函数、自定义函数、变量、流程控制语句、光标/游标、定义条件和处理程序的使用示例
查看>>
mysql中实现rownum,对结果进行排序
查看>>
mysql中对于数据库的基本操作
查看>>