UVA-140 Bandwidth 带宽

题目链接:https://vjudge.net/problem/UVA-140

题意:给出一个n(n<=8)个结点的图G和一个结点的排列,定义结点 i 的宽带b(i)为 i 和相邻结点在排列中的最远距离,而所有b(i)的最大值就是整个图的G,一个图有很多排列,求出让带宽最小的结点排列。

举例说明:

UVA-140 Bandwidth 带宽_第1张图片

如图,最右边是无向图,下面两幅图都遵循这个连接方式,下面两幅图中,左图各结点的带宽分别是6,6,1,4,1,1,6,6。右图各结点带宽分别为5,3,1,4,3,5,1,4。

分析:n比较小,暴力求解,利用STL中next_permutation函数枚举全排列,逐个计算出其带宽,找出最小值即可。不过也并非完全不能优化,可以进行剪枝操作降低复杂度,如果发现某个排列中两个结点的距离大于当前找到的最优解,那么这个排列一定不是答案,直接剪掉。注意多组输入,要对数组初始化。否则会出错(我第一遍交没有初始化,结果交上去超时)。

#include
#include
#include
#include
#include
using namespace std;
const int INF=0x7fffffff;
const int maxn=30;
int let[maxn],let_copy[maxn],pos[maxn];
vector v[maxn];

int main() {
    //freopen("in.txt","r",stdin);
    string s;
    while(cin>>s&&s!="#"){
        memset(pos,0,sizeof(pos));
        for(int i=0;ians) break;  //剪枝操作
            }
            if(ans>maximum){ 
                ans=maximum;
                memcpy(let_copy,let,sizeof(let)); //使用函数更快,保存答案
            }
        } while(next_permutation(let,let+k)); //枚举全排列
        for(int i=0;i "<




你可能感兴趣的:(暴力,暴力)