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

Các bước đi có thể từ nguồn đến đích với chính xác k cạnh


Một đồ thị có hướng được đưa ra. Hai đỉnh khác u và v cũng được cho trước, u là đỉnh bắt đầu và v là đỉnh kết thúc. Nhiệm vụ của chúng ta là tìm một số đường đi từ đỉnh u đến v có đúng k cạnh. Giá trị của k cũng được cung cấp trong thuật toán.

Bằng cách sử dụng lập trình động, chúng ta cần tạo một bảng 3D, trong đó hàng sẽ trỏ các giá trị của u, các cột sẽ trỏ các giá trị v và chiều sâu sẽ được sử dụng để theo dõi số cạnh từ đầu đến cuối.

Đầu vào và Đầu ra

 Đầu vào:Ma trận kề của đồ thị:Đỉnh đích là 3. K =20 1 1 10 0 0 10 0 0 10 0 0 0 Đầu ra:Có 2 bước đi có thể, từ 0 đến 3 với 2 cạnh.  

Thuật toán

 numberOdWboards (u, v, k) 

Đầu vào: Đỉnh đầu u, đỉnh kết thúc v, số cạnh k.

Đầu ra: Số lần đi bộ có thể có k cạnh.

 Bắt đầu xác định số mảng 3D theo thứ tự (nxnx k + 1) // n là số đỉnh của cạnh trong phạm vi 0 đến k, thực hiện với tôi trong phạm vi 0 đến n-1, thực hiện cho j trong phạm vi 0 đến n -1, đếm [i, j, edge]:=0 nếu edge =0 và i =j, sau đó đếm [i, j, edge]:=1 nếu edge =1 và (i, j) được kết nối, thì count [i, j, edge]:=1 nếu edge> 1, thì đối với a trong phạm vi từ 0 đến n và liền kề với i do count [i, j, edge]:=count [i, j, edge] + count [a, j, edge - 1] done done done done done return count [u, v, k] End 

Ví dụ

 #include  #define NODE 7 sử dụng không gian tên std; int graph [NODE] [NODE] ={{0, 1, 1, 1}, {0, 0, 0, 1}, {0, 0, 0, 1}, {0, 0, 0, 0}}; int numberOfW domains (int u, int v, int k) {int count [NODE] [NODE] [k + 1]; for (int edge =0; edge <=k; edge ++) {// cho k cạnh (0..k) for (int i =0; i  1) {// cho nhiều hơn một cạnh for (int a =0; a  

Đầu ra

 Có thể có 2 bước đi, từ 0 đến 3 với 2 cạnh.