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

2021-08-07 05:45:35 字數 1010 閱讀 6436

通過點與點之間的距離重新構造出點集。距離集大小為n(n-1)/2,n為點的個數。

驅動程式

#include 

#include

#include

using

namespace

std;

bool turnpike(vector

& x,multiset

d,int n)

else

return

false;

}

回溯部分

//x存放結果,d為距離集,n為點個數

bool place(vector

& x,multiset

& d,int n,int left,int right)

else

//測試右半部分

if(test)

}//將左半部分刪除的值插入回去

for(auto itr=tmp.begin();itr!=tmp.end();++itr)

//如果x[right]放置正確

if(test)

}//測試放在左邊x[left]=x[n]-dmax

if(!found)

else

if(test)

}for(auto itr=tmp.begin();itr!=tmp.end();++itr)

if(test)}}

return found;

}

main.cpp

int main(int argc, const

char * argv) ;

vector

x(n+1);

turnpike(x, d, n);

for(int i=1;i<=n;++i)

結果

0 3

5 6

8 10

hello, world!

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

給出乙個距離的集合d,求出在x軸,存在哪些點能夠組合成這樣的距離集合 假設第乙個點在0處 path 1 0 最後乙個點是距離集合中最大的距離 path n max d 使用堆或是紅黑樹存放距離集合d include include include using namespace std bool p...

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

第一次錯誤 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的距離.這時候有兩種情況,因此我...