|
| 1 | +/* |
| 2 | + valid tree 쑰건 |
| 3 | + 1. μ¬μ΄ν΄μ΄ μμ΄μΌνλ€ |
| 4 | + 2. λͺ¨λ κ° λ
Έλλ€μ μ μ΄λ νλμ λ€λ₯Έ λ
Έλμ μ°κ²°λμ΄ μμ΄μΌ νλ€ |
| 5 | +
|
| 6 | + μΈμ 리μ€νΈ νμμΌλ‘ 무방ν₯ κ°μ μ 보λ₯Ό μ μ₯νκ³ , |
| 7 | + dfs μ¬κ· νμμΌλ‘ λ°©λ¬Έ μ²΄ν¬ ν μμ λ
Έλλ₯Ό μ¬κ·μ μΌλ‘ λ°©λ¬Ένλ©΄μ μ¬μ΄ν΄ νλ¨ |
| 8 | +*/ |
| 9 | + |
| 10 | +class Solution { |
| 11 | + public: |
| 12 | + /** |
| 13 | + * @param n: An integer |
| 14 | + * @param edges: a list of undirected edges |
| 15 | + * @return: true if it's a valid tree, or false |
| 16 | + */ |
| 17 | + bool validTree(int n, vector<vector<int>> &edges) { |
| 18 | + if (edges.size() != n - 1) |
| 19 | + return false; |
| 20 | + |
| 21 | + // μΈμ ν λ
Έλλ€μ μμλ‘ κ°μ§λ adj λ°°μ΄ μμ± |
| 22 | + vector<vector<int>> adj(n); |
| 23 | + |
| 24 | + for (auto edge : edges) { |
| 25 | + int u = edge[0]; |
| 26 | + int v = edge[1]; |
| 27 | + adj[u].push_back(v); |
| 28 | + adj[v].push_back(u); |
| 29 | + } |
| 30 | + |
| 31 | + // λ°©λ¬Έ κΈ°λ‘ |
| 32 | + vector<bool> visited(n, false); |
| 33 | + if (!dfs(0, -1, adj, visited)) |
| 34 | + return false; |
| 35 | + |
| 36 | + // λͺ¨λ λ
Έλκ° λ°©λ¬Έλμλμ§ (μ°κ²°λλμ§) νμΈ |
| 37 | + for (bool v : visited) { |
| 38 | + if (!v) |
| 39 | + return false; |
| 40 | + } |
| 41 | + return true; |
| 42 | + } |
| 43 | + |
| 44 | + bool dfs(int node, int parent, vector<vector<int>>& adj, vector<bool> visited) { |
| 45 | + visited[node] = true; |
| 46 | + |
| 47 | + for (int neighbor : adj[node]) { |
| 48 | + if (neighbor == parent) |
| 49 | + continue ; // λ°λ‘ μ΄μ λ
Έλλ 무μ(μ볡 λ°©μ§) |
| 50 | + if (visited[neighbor]) |
| 51 | + return false; // μ¬μ΄ν΄ νμ§ |
| 52 | + if (!dfs(neighbor, node, adj, visited)) |
| 53 | + return false; |
| 54 | + } |
| 55 | + return true; |
| 56 | + } |
| 57 | + }; |
0 commit comments