POJ 2531(搜尋剪枝)

2021-07-25 02:59:52 字數 870 閱讀 7823

題目鏈結poj2531

乙個有n個節點的圖(n≤

20 ),節點間距c給定,讓你把這個圖分為a、b兩類節點使得∑c

ij,(

i∈a,

j∈b)

最大,問這個最大值是多少。

由於n很小只有20,可以直接列舉,複雜度是220

∗202 超時。需要剪枝。這道題的剪枝技巧是:

採用深度優先搜尋的方法,對每乙個節點都做判斷是否應該移到另一組去,判斷的依據是移過去和不移過去哪個得到的和值比較大。如果移過去後值變小了則不移過去並且剪掉這條支路。

這個剪枝策略的正確性證明還沒想出來,以後再補。

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

int n;

int c[25][25];

int a[25];

int ans;

void print()

int ans2=ans;

dfs(x+1,ans);

a[x]=1;

for(int i=1;iif(a[i]==1)ans2-=c[x][i];

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

if(a[i]==0)ans2+=c[x][i];

if(ans2>=ans)

a[x]=0;

}int main()

}

POJ 1011 搜尋剪枝

題意 給一堆木棒,這些木棒是由幾根長度相同的長木棒厥斷而成的,求最短的長木棒長度能厥成這些短的木棒。題解 所求長度肯定介於最長木棒和木棒之和中間,並且可以整除木棒之和。於是窮舉所有可能的值,選中乙個值之後,用dfs給木棒尋找組合,能找到就輸出。直接dfs會超時,所以需要剪枝。可以先排序,這樣相同的木...

POJ 2362 搜尋 剪枝

給出一些不同長度的小棒,問小棒全部用完是否能構成乙個正方形。通過特判來起到剪枝的作用 include include includeusing namespace std const int maxn 25 int a maxn bool vis maxn int n,l 記錄正方形邊長 bool ...

poj 1011 sticks(搜尋 剪枝)

題型 搜尋題 題意 此題堪稱最經典搜尋題。description 喬治拿來一組等長的木棒,將它們隨機地裁斷,使得每一節木棍的長度都不超過50個長度單位。然後他又想把這些木棍恢復到為裁截前的狀態,但忘記了初始時有多少木棒以及木棒的初始長度。請你設計乙個程式,幫助喬治計算木棒的可能最小長度。每一節木棍的...