UVA 140 全排列 剪枝

2021-08-22 13:25:10 字數 788 閱讀 4996

題意:給定n(n<=8)個節點的圖和乙個節點的排列,定義節點i的頻寬為i和相鄰節點在排列中的最遠距離,整個圖的頻寬便是每個節點頻寬的最大值,給定圖g,求出讓頻寬最小的節點排列。

題解:因為資料範圍不大,所以直接用next_permutation函式列舉每種情況,對每個排列ji其實進行計算,當得到的最大值比目前的最小值要大或者相等時就剪枝,(其實不剪也能過)。因為是輸出最小字典序,所以要從最小的字典序開始用next_permutation函式,只記錄第一次遇到新低時的字典序。

ac**:

#include#include#include#include#include#define maxn 30

using namespace std;

typedef long long ll;

int mp[maxn][maxn];

int vis[maxn],num[10];

int minn,cnt,pos[maxn],ans[10];

bool read(){

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

memset(mp,0,sizeof(mp));

char ch='.';

while(ch!='\n'){

ch=getchar();

if(ch=='#') return false;

int id=ch-'a';

vis[id]=1;

ch=getchar();

while((ch=getchar())!=';'&&a

uva140 Bandwidth 排列樹 剪枝

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

uva140 dfs(回溯)最優性剪枝

題解 1.原書中已經說明,如果兩個節點的頻寬 最小頻寬,無論如何也不可能比原解更優,應該剪掉。2.注意此題讀入的時候一定要按字典序儲存,這樣計算出的最小值才是符合要求的 3.注意strtok的用法 include include include include include include inc...

DFS 全排列 素數剪枝判斷

許爺某天ak太多了心煩,想帶領他的小跟班們做遊戲 遊戲內容如下 當許爺喊出乙個數字n時,便有n個小夥伴,身上帶著1到n的數字,手牽手拉成乙個環。當環裡的每個人相鄰兩人身上數字之和都為素數時,便找到了乙個環。當找出所有的環時,遊戲便結束。note 每個環的第乙個數字必須是1 input n 0 n 2...