Bandwidth(爆搜)

Posted coder-cjh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Bandwidth(爆搜)相关的知识,希望对你有一定的参考价值。

这是一道暴力都能过的题,重点其实在于理解题意,输入过程也有一点繁琐。

1.题意

先给定一个无向图,要重新安排结点的顺序,使得相邻的节点在排列中的最大距离最小

2.Solution

明显的爆搜,难就难在如何建模,其实只要把出现过的字符放到一个数组记录起来,然后搜索的时候依次安排每个节点的字母

分块讲解:

(1)输入

//首先我们可以先把":"前面的字符提出来作为u,再在:后面的字符拿出来做v
//Coder-cjh
void init()
    mind=1e9;tot=0; 
    memset(v,0,sizeof(v));
    memset(id,0,sizeof(id));
    memset(can,0,sizeof(can));//多测不清空,爆零两行泪
    for(int i=0;i<s.size();i++)
     if(isalpha(s[i]))
      if(!id[s[i]-A])id[s[i]-A]=1,tr[++tot]=s[i]-A;//如果出现了没有遇到的就记录
    int ls=s[0]-A;//第一个字符一定会是字母
    for(int i=1;i<s.size();i++)
     if(s[i]==:)//如果是“:”,之后的就是v
      ++i;
      while(i<s.size()&&s[i]!=;)v[ls][s[i]-A]=v[s[i]-A][ls]=1,++i;//一直读到;
     
     else if(s[i]!=;)ls=s[i]-A;//再找到下一次的u

(2)搜索

//Coder-cjh
bool cmp(int a[],int ans[])//因为有点怂,所以手写cmp函数
    for(int i=1;i<=tot;i++)
     if(a[i]!=ans[i])
      return a[i]>ans[i];
    return false;

void dfs(int step,int md)
    if(md>mind)return;//最优性剪枝
    if(step==tot+1)
     if(md==mind&&cmp(a,ans))return;
     mind=md,memcpy(ans,a,sizeof(a));
     return;
    
    for(int i=1;i<=tot;i++)
     if(!can[tr[i]])
         can[tr[i]]=1;//打上标记
         a[step]=tr[i];
         int tmp=0;
         for(int j=1;j<step;j++)
          if(v[tr[i]][a[j]])tmp=max(tmp,step-j);//计算出目前的带宽
         dfs(step+1,max(tmp,md));
         can[tr[i]]=0;
     

 

以上是关于Bandwidth(爆搜)的主要内容,如果未能解决你的问题,请参考以下文章

[2016-02-20][UVA][140][Bandwidth]

UVA140-Bandwidth(搜索剪枝)

Uva 140 Bandwidth

Hadoop fs -put bandwidth 暴力版

TC limit bandwidth

uva140 Bandwidth