通過點與點之間的距離重新構造出點集。距離集大小為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的距離.這時候有兩種情況,因此我...