Computer >> Máy Tính >  >> Lập trình >> C ++

Chương trình C ++ để tìm ra các siêu đỉnh trong một đồ thị

Giả sử, chúng ta được cho một đồ thị có n đỉnh. Các đỉnh được đánh số từ 1 đến n và chúng được nối với nhau bởi các cạnh được cho trong mảng 'các cạnh'. Mỗi đỉnh có giá trị 'x' trong một số từ 1 đến n được cho trong 'giá trị' của mảng. Bây giờ, chúng ta phải tìm ra các siêu đỉnh từ đồ thị. Đỉnh i được gọi là 'siêu đỉnh' bất cứ khi nào đường đi ngắn nhất từ ​​đỉnh 1 đến i không có đỉnh có cùng giá trị 'x' với đỉnh thứ i. Chúng tôi in ra tất cả các đỉnh thỏa mãn tiêu chí này.

Chương trình C ++ để tìm ra các siêu đỉnh trong một đồ thị

Vì vậy, nếu đầu vào là n =5, các giá trị ={1, 2, 2, 1, 3}, các cạnh ={{1, 2}, {2, 3}, {2, 3}, {2, 4 }, {4, 5}}, thì kết quả đầu ra sẽ là 1 3 4 5.

Mọi đỉnh ngoại trừ đỉnh 2 đều thỏa mãn tiêu chí. Vì vậy, đỉnh 2 bị loại trừ.

Các bước

Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -

 Xác định mảng vertexVal, frq và chk có kích thước:100005 Xác định vcti mảng có kích thước 200005.Xác định một hàm dfs (), hàm này sẽ nhận j, k, nếu frq [vertexVal [j]] bằng 0 , thì:chk [j]:=1 (tăng frq [vertexVal [j]] lên 1) cho mỗi giá trị a trong vcti [j], do:nếu a không bằng k thì:dfs (a, j) (giảm frq [vertexVal [j]] đi 1) để khởi tạo i:=0, khi i  

Ví dụ

Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -

 #include  using namespace std; int n; int vertexVal [100005], frq [100005], chk [100005]; vector  vcti [200005]; void dfs (int j, int k) {if (frq [vertexVal [j]] ==0) chk [j] =1; frq [vertexVal [j]] ++; for (auto a:vcti [j]) {if (a! =k) dfs (a, j); } frq [vertexVal [j]] -;} void giải (int giá trị [], vector > edge) {for (int i =0; i > edge ={{1, 2}, {2, 3}, {2, 3}, {2, 4}, {4, 5}}; giải quyết (giá trị, cạnh); trả về 0;} 

Đầu vào

 5, {1, 2, 2, 1, 3}, {{1, 2}, {2, 3}, {2, 3}, {2, 4}, {4, 5}}  

Đầu ra

 1345