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.
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 iVí dụ
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
#includeusing 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