กำหนดจุดยอดของป่า (คอลเลกชันของต้นไม้) เป้าหมายคือการหาจำนวนต้นไม้ในป่านั้น เราจะดำเนินการนี้โดยใช้อัลกอริธึม DFS (การค้นหาครั้งแรกในเชิงลึก) บนฟอเรสต์
ตัวอย่าง
อินพุต
edges = { { 1,3 }, {2,8}, {2,6}, {3,5}, {3,7}, {4,8} } ผลลัพธ์
Count of number of trees in a forest are: 3
คำอธิบาย
จำนวนต้นไม้ที่มีอยู่ในป่าคือ −

แนวทางที่ใช้ในโปรแกรมด้านล่างมีดังนี้ −
ในแนวทางนี้ เราใช้อัลกอริธึมการค้นหาแบบ Depth First บนกราฟแบบเรียกซ้ำ เราจะเพิ่มจำนวนขึ้นหากทุกโหนดที่เชื่อมต่อถูกทำเครื่องหมายว่าเข้าชมจากแหล่งเดียว (ซึ่งหมายความว่ามีการสร้างต้นไม้)
-
หาจุดยอดจำนวนเต็มเป็นจำนวนจุดยอดบนกราฟ
-
ใช้ vector vector
vec[vertice] เพื่อเก็บจุดยอดเป็นจำนวนเต็ม -
ฟังก์ชั่น insert(vector
vec[], int parent, int child) รับ vec[] และเพิ่มขอบระหว่างโหนดหลักและลูกในเวกเตอร์นั้น -
เพิ่ม edge โดยใช้ vec[parent].push_back(child) และ vec[child].push_back(parent)
-
ฟังก์ชันที่เกิดซ้ำ (int temp, vector
vec[], vector &check) ใช้ DFS บนกราฟจากจุดยอดเริ่มต้น -
Array check[temp] ใช้เพื่อตั้งค่าโหนดตามที่เยี่ยมชม/ไม่ได้เยี่ยมชมโดยใช้ true/false
-
Traverse vector vec[] ใช้ for loop และถ้า check[vec[temp][i]] เป็นเท็จ callrecurred(vec[temp][i], vec, check) แบบเรียกซ้ำสำหรับโหนดที่เชื่อมต่อ
-
Function Trees_Forest(vector
vec[], int vertice) รับ vec[] และคืนค่าจำนวนต้นไม้ในป่าที่กำหนดเป็นรายการ adjacency ใน vec[] -
นับป่าเริ่มต้นเป็น 0
-
ตรวจสอบ vector
(จุดยอด, เท็จ) เพื่อทำเครื่องหมายจุดยอดของกราฟตามที่เข้าชม -
ข้ามจุดยอดทั้งหมดโดยใช้ for loop
-
หาก check[i] เป็นเท็จ ให้ใช้ dfs โดยใช้ recurred(i, vec, check) และ incrementcount
-
ที่ส่วนท้ายของการวนซ้ำทั้งหมดจะนับเป็นผลลัพธ์
ตัวอย่าง
#include<bits/stdc++.h>
using namespace std;
void insert(vector<int> vec[], int parent, int child){
vec[parent].push_back(child);
vec[child].push_back(parent);
}
void recurred(int temp, vector<int> vec[], vector<bool> &check){
check[temp] = true;
int size = vec[temp].size();
for(int i = 0; i < size; i++){
if (check[vec[temp][i]] == false){
recurred(vec[temp][i], vec, check);
}
}
}
int Trees_Forest(vector<int> vec[], int vertice){
int count = 0;
vector<bool> check(vertice, false);
for(int i = 0; i < vertice; i++){
if(check[i] == false){
recurred(i, vec, check);
count++;
}
}
return count;
}
int main(){
int vertice = 9;
vector<int> vec[vertice];
insert(vec, 1, 3);
insert(vec, 2, 8);
insert(vec, 2, 6);
insert(vec, 3, 5);
insert(vec, 3, 7);
insert(vec, 4, 8);
cout<<"Count of number of trees in a forest are: "<<Trees_Forest(vec, vertice);
return 0;
} ผลลัพธ์
หากเราเรียกใช้โค้ดข้างต้น มันจะสร้างผลลัพธ์ต่อไปนี้ -
Count of number of trees in a forest are: 3