สมมติว่าเรามีโหนด n โหนดซึ่งมีป้ายกำกับตั้งแต่ 0 ถึง n-1 และรายการขอบที่ไม่มีทิศทาง [u,v] เราต้องกำหนดฟังก์ชันเพื่อตรวจสอบว่าขอบเหล่านี้เป็นต้นไม้ที่ถูกต้องหรือไม่
ดังนั้น หากอินพุตเป็น n =5 และ edge =[[0,1], [0,2], [0,3], [1,4]] ผลลัพธ์จะเป็นจริง
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดฟังก์ชัน dfs() ซึ่งจะใช้โหนด พาร์ กราฟ และอาร์เรย์อื่นที่เรียกว่า เยี่ยมชมแล้ว
-
ถ้าเยี่ยมชม[โหนด] เหมือนกับ 1 แล้ว −
-
คืนความจริง
-
-
ถ้าเยี่ยมชม[โหนด] เหมือนกับ 2 แล้ว −
-
คืนค่าเท็จ
-
-
เยี่ยมชม[โหนด] :=2
-
ret :=จริง
-
สำหรับการเริ่มต้น i :=0 เมื่อฉัน <ขนาดของกราฟ[โหนด] อัปเดต (เพิ่ม i ขึ้น 1) ทำ -
-
ถ้ากราฟ[node, i] ไม่เท่ากับพาร์ −
-
ret :=ret และ dfs(กราฟ[โหนด, i], โหนด, กราฟ, เข้าชมแล้ว)
-
-
-
เยี่ยมชม[โหนด] :=1
-
รีเทิร์น
-
จากวิธีหลัก ให้ทำดังต่อไปนี้ −
-
กำหนดอาร์เรย์ที่เข้าชมขนาด n และเติมค่านี้ด้วย 0
-
กำหนดรายการที่เรียกว่ากราฟขนาด n
-
สำหรับการเริ่มต้น i :=0 เมื่อ i <ขนาดขอบ อัปเดต (เพิ่ม i ขึ้น 1) ทำ -
-
u :=edge[i, 0], v :=Edge[i, 1]
-
แทรก v ที่ส่วนท้ายของกราฟ[u]
-
ใส่ u ที่ท้ายกราฟ[v]
-
-
ถ้า dfs(0, -1, กราฟ, เข้าชม) เป็นเท็จ −
-
คืนค่าเท็จ
-
-
สำหรับการเริ่มต้น i :=0 เมื่อ i
-
ถ้าไปเยี่ยม[i] จะเป็นศูนย์ ดังนั้น −
-
คืนค่าเท็จ
-
-
-
คืนความจริง
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#include <bits/stdc++.h> using namespace std; class Solution { public: bool dfs(int node, int par, vector <int< graph[], vector <int<& visited){ if (visited[node] == 1) return true; if (visited[node] == 2) return false; visited[node] = 2; bool ret = true; for (int i = 0; i < graph[node].size(); i++) { if (graph[node][i] != par) ret &= dfs(graph[node][i], node, graph, visited); } visited[node] = 1; return ret; } bool validTree(int n, vector<vector<int<>& edges) { vector<int< visited(n, 0); vector<int< graph[n]; for (int i = 0; i < edges.size(); i++) { int u = edges[i][0]; int v = edges[i][1]; graph[u].push_back(v); graph[v].push_back(u); } if (!dfs(0, -1, graph, visited)) return false; for (int i = 0; i < n; i++) { if (!visited[i]) return false; } return true; } }; main(){ Solution ob; vector<vector<int<> v = {{0,1},{0,2},{0,3},{1,4}}; cout << (ob.validTree(5,v)); }
อินพุต
5, {{0,1},{0,2},{0,3},{1,4}}
ผลลัพธ์
1