題目:140 - bandwidth
題目大意:給出一些點,點和點之間是否相連,求這些點怎麼排列可以使的所有點形成的圖的頻寬最小。如果有多種情況按照字典序輸出。圖的頻寬指的是點的頻寬的最大值,點的頻寬指的是,所有和這個點聯通的其他的點到這個點的距離的最大值。
解題思路:轉換成全排列問題。將這裡點和點的聯通關係存放在鄰接表中,注意這裡的邊是無向的就說明點和點之間的連通關係是雙向的。然後對全排列進行篩選。如果某個點與他相鄰的點的距離》= 現在所暫定的最小值,就說明這種狀況下無法產生比原來的狀況更好的排列,就不需要擴充套件了。還有如果這個點還有m個相鄰的點未確定位置,這樣的最好情況就是這m個點都排在這個點的後面,最好的情況頻寬是m,如果m>=當前暫定的最小值,這就說明最好情況下都不可能產生比原理的狀況更好的序列,這樣的情況就可以不用往後面擴充套件了。還有全排列的時候要按照字典序先的來排,這樣在頻寬相同的情況下就只要比較前面的排列即可。
#include#include#include#includeusing namespace std;
const int n = 8;
const int m = 26;
char e[m][m];
char str[n * m], s[n], c[n], co[n];
int n, vis[m], sum;
void handle (int cur)
}if (count1 < count)
count1 = count;
} if (count1 < sum)
return;
} for (int i = 0; i < n; i++)
if (!flag)
break;
if (count1 == cur)
count++;}}
if (flag && count >= sum )
flag = 0;
if (flag)
} }}int main ()
if (!*( p + 1))
break;
for (p = p + 2; *p != ';' && *p; p++)
}if (*p == ';')
p++;
}} memset(vis, 0, sizeof(vis));
sort(s, s + n);
sum = n;
handle(0);
for (int i = 0; i < n; i++)
printf("%c ", co[i]);
printf("-> %d\n", sum);
} return 0;
}
uva140 Bandwidth 排列樹 剪枝
題目描述 給定一張圖,問如何順序排列結點,能使排列中任意有邊相連的兩個節點之間的距離最大的值最小,如果有兩個排列最大值相等,請輸出字典序小的 分析 排列樹 剪枝 在構造排列樹的同時檢查當前已經構成的序列中最大值是否小於最優質,如果大於剪掉即可 include include include usin...
遞迴回溯 UVa140 Bandwidth寬頻
本題題意 尋找乙個排列,在此排序中,頻寬的長度最小 頻寬是指 任意一點v與其距離最遠的且與v有邊相連的頂點與v的距離的最大值 若有多個,按照字典序輸出最小的哪乙個。解題思路 方法一 由於題目說結點的個數最多是8個,所以,最先想到的方法是暴力列舉,將所有的結點全排列,然後找到寬頻長度最小的那乙個,此方...
UVA 140 全排列 剪枝
題意 給定n n 8 個節點的圖和乙個節點的排列,定義節點i的頻寬為i和相鄰節點在排列中的最遠距離,整個圖的頻寬便是每個節點頻寬的最大值,給定圖g,求出讓頻寬最小的節點排列。題解 因為資料範圍不大,所以直接用next permutation函式列舉每種情況,對每個排列ji其實進行計算,當得到的最大值...