uva140 dfs(回溯)最優性剪枝

2021-07-04 17:16:32 字數 1361 閱讀 3560

題解:

1.原書中已經說明,如果兩個節點的頻寬 >= 最小頻寬,無論如何也不可能比原解更優,應該剪掉。

2.注意此題讀入的時候一定要按字典序儲存,這樣計算出的最小值才是符合要求的

3.注意strtok的用法

#include

#include

#include

#include

//#include

#include

#include

#include

#include

#include

#include

///#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define lch(x) ((x) << 1)

#define rch(x) ((x)<<1|1)

#define dad(x) ((x)>>1)

#define lowbit(x) ((x)&(-x))

typedef

long

long

int ll;

const

int inf = ~0u>>1;

const

double eps = 1e-6;

const

long

double pi = acos(0.0) * 2.0;

const

int n = 10+200;

map id;

int mi ,n;

char in[n];

int v[n],ans[n],tmp[n];

bool vis[n],g[n][n];

bool read();

void dfs(int cur , int x);

int id(char x)

int main()

return0;}

bool read()

memset(vis,0,sizeof(vis));

return1;}

void dfs(int cur , int x)

for(int i = 0 ; i < n ; i++)//回溯生成排列

}dk = max(x,dk);

if(dk < mi) dfs(cur+1,dk); //如果某個節點的頻寬比當前最小頻寬大,剪掉它

vis[i] = 0;}}

}

遞迴回溯 UVa140 Bandwidth寬頻

本題題意 尋找乙個排列,在此排序中,頻寬的長度最小 頻寬是指 任意一點v與其距離最遠的且與v有邊相連的頂點與v的距離的最大值 若有多個,按照字典序輸出最小的哪乙個。解題思路 方法一 由於題目說結點的個數最多是8個,所以,最先想到的方法是暴力列舉,將所有的結點全排列,然後找到寬頻長度最小的那乙個,此方...

UVA 140 全排列 剪枝

題意 給定n n 8 個節點的圖和乙個節點的排列,定義節點i的頻寬為i和相鄰節點在排列中的最遠距離,整個圖的頻寬便是每個節點頻寬的最大值,給定圖g,求出讓頻寬最小的節點排列。題解 因為資料範圍不大,所以直接用next permutation函式列舉每種情況,對每個排列ji其實進行計算,當得到的最大值...

uva140 Bandwidth 排列樹 剪枝

題目描述 給定一張圖,問如何順序排列結點,能使排列中任意有邊相連的兩個節點之間的距離最大的值最小,如果有兩個排列最大值相等,請輸出字典序小的 分析 排列樹 剪枝 在構造排列樹的同時檢查當前已經構成的序列中最大值是否小於最優質,如果大於剪掉即可 include include include usin...