摘要:題目鏈接檢查圖的連通性及是否有環(huán),可以,,從一個點出發(fā)看能不能遍歷所有的點,同時來檢查是否有環(huán)。還可以用檢查是否有環(huán),最后看的數(shù)量是否等于來判斷是不是。
261. Graph Valid Tree
題目鏈接:https://leetcode.com/problems...
檢查圖的連通性及是否有環(huán),可以dfs,bfs,從一個點出發(fā)看能不能遍歷所有的點,同時visited來檢查是否有環(huán)。還可以用union find檢查是否有環(huán),最后看edge的數(shù)量是否等于n-1來判斷是不是spinning tree。
public class Solution { public boolean validTree(int n, int[][] edges) { if(edges.length != n - 1) return false; map = new int[n]; Arrays.fill(map, -1); // union find for(int[] edge : edges) { int root1 = find(edge[0]); int root2 = find(edge[1]); // if connected before, there is a cycle if(root1 == root2) return false; // union map[root1] = root2; } return true; } int[] map; private int find(int child) { while(map[child] != -1) child = map[child]; return child; } }
dfs注意要保留parent指針,這樣防止出現(xiàn)u->v之后又返回查一遍
public class Solution { public boolean validTree(int n, int[][] edges) { // build graph build(edges, n); // store visited node Setvisited = new HashSet(); // dfs from 0, to check if visited all nodes and if cycle if(dfs(visited, 0, -1)) return false; return visited.size() == n; } // adjacent list to represent graph List > graph; private void build(int[][] edges, int n) { graph = new ArrayList(); for(int i = 0; i < n; i++) graph.add(new HashSet()); for(int[] edge : edges) { graph.get(edge[0]).add(edge[1]); graph.get(edge[1]).add(edge[0]); } } private boolean dfs(Set visited, int u, int parent) { // has cycle if(visited.contains(u)) return true; visited.add(u); for(int v : graph.get(u)) { if(v == parent) continue; if(dfs(visited, v, u)) return true; } return false; } }
bfs同樣要要注意避免走重復(fù)路經(jīng)的問題,遍歷過的點就刪掉。
public class Solution { public boolean validTree(int n, int[][] edges) { // build graph build(edges, n); // store visited node Setvisited = new HashSet(); // bfs from 0, to check if visited all nodes and if cycle return bfs(visited, n); } // adjacent list to represent graph List > graph; private void build(int[][] edges, int n) { graph = new ArrayList(); for(int i = 0; i < n; i++) graph.add(new HashSet()); for(int[] edge : edges) { graph.get(edge[0]).add(edge[1]); graph.get(edge[1]).add(edge[0]); } } private boolean bfs(Set visited, int n) { Queue q = new LinkedList(); q.offer(0); while(!q.isEmpty()) { int u = q.poll(); if(visited.contains(u)) return false; visited.add(u); for(int v : graph.get(u)) { q.offer(v); // remove parent, avoid duplicate graph.get(v).remove(u); } } return visited.size() == n; } }
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/69875.html
摘要:這樣就將一個集合的節(jié)點歸屬到同一個集合號下了。最后如果并查集中只有一個集合,則說明可以構(gòu)建樹。 Graph Valid Tree Given n nodes labeled from 0 to n - 1 and a list of undirected edges (each edge is a pair of nodes), write a function to check w...
摘要:只有一個連通分量還沒有環(huán),就是樹,無根樹。無向圖邊的兩端是對稱的,無向圖講究連通這個概念,沒有方向,沒有拓?fù)洌芟窦希苑浅_m合用并查集來解決。并查集寫法參考注意方法用找的老大哥,合并的是的老大哥。 Graph Valid Tree Given n nodes labeled from 0 to n - 1 and a list of undirected edges (each...
Problem Given n nodes labeled from 0 to n - 1 and a list of undirected edges (each edge is a pair of nodes), write a function to check whether these edges make up a valid tree. Example Given n = 5 and...
摘要:不得不說,對于這道題而言,是一種很木訥的模板。主函數(shù)按矩陣大小建立一個類進(jìn)行后續(xù)操作一個結(jié)點用來連接邊角不可能被圍繞的一個函數(shù)對矩陣元素進(jìn)行結(jié)點線性化。同理,,,在主函數(shù)中初始化后調(diào)用。 Surrounded Regions Problem Given a 2D board containing X and O (the letter O), capture all regions s...
摘要:實現(xiàn)從后臺獲取數(shù)據(jù),并賦值默認(rèn)值,同時也可以對選框進(jìn)行更改,即實現(xiàn)雙向綁定使用和方式實現(xiàn)雙向綁定,如下請選擇開始時間和結(jié)束時間獲取默認(rèn)時間將后臺傳回的默認(rèn)時間數(shù)據(jù)放在時間選擇框內(nèi)按照后臺傳回的數(shù)據(jù),將斜杠前的時間作為初始時間按照 實現(xiàn)從后臺獲取數(shù)據(jù),并賦值默認(rèn)值,同時也可以對選框進(jìn)行更改,即實現(xiàn)雙向綁定 1、使用value和on-change方式實現(xiàn)雙向綁定,html如下: js...
閱讀 908·2021-09-03 10:42
閱讀 1518·2019-08-30 15:56
閱讀 1453·2019-08-29 17:27
閱讀 879·2019-08-29 15:25
閱讀 3166·2019-08-26 18:27
閱讀 2487·2019-08-26 13:41
閱讀 1895·2019-08-26 10:39
閱讀 1585·2019-08-23 18:36