回溯演算法(收費公路重建問題)

2021-10-07 16:59:20 字數 1175 閱讀 4264

給出乙個距離的集合d, 求出在x軸,存在哪些點能夠組合成這樣的距離集合;

假設第乙個點在0處:path[1] = 0;

最後乙個點是距離集合中最大的距離:path[n] = max(d);

使用堆或是紅黑樹存放距離集合d;

#include

#include

#include

using namespace std;

bool place

(vector<

int>

& path, multiset<

int>

& d,

int n,

int left,

int right)}if

(i == left)}if

(i == n +1)

else

return true;

} path[left]

= path[n]

- path[right]

;for

(i =

1; i < left; i++)}

if(i == left)}if

(i == n +1)

else

return true;}}

return false;}}

bool turnpike

(vector<

int>

& path, multiset<

int>

&d,int n)

return0;

}int

main()

;int len =

sizeof

(arr)

/sizeof

(arr[0]

);for(

int i =

0; i < len; i++

) d.

insert

(arr[i]);

int n =6;

vector<

int>

path

(n+1);

turnpike

(path, d, n)

;for

(auto x: path)

cout << x << endl;

return0;

}

回溯演算法 收費公路重建問題

通過點與點之間的距離重新構造出點集。距離集大小為n n 1 2,n為點的個數。驅動程式 include include include using namespace std bool turnpike vector x,multiset d,int n else return false 回溯部分...

收費公路重建問題,回溯 遞迴

第一次錯誤 pos start dmax printf dmax d n dmax for i 0 i分析 漏掉了found在遞迴時仍然不符合要求的情況,應該在遞迴結束後仍然檢測found值,0則仍然回溯 新增 如下 if found for i 0 i第二次錯誤 新增 位置錯誤,導致重複回溯 po...

公路重建問題

1 可以知道,距離最大的一定是從第乙個點到最後乙個點的.那麼我們將第乙個點的座標定為0,最後乙個點的座標定為10.2 接下來刪除集合中的距離10,那麼該集合就是由n 1個點構成的距離集合.接下來,再去最大的距離,很顯然,距離8可以是乙個點到x0的距離,也可以是點到x6的距離.這時候有兩種情況,因此我...