全排列回溯剪枝。

题目数据很水。记录当前最小带宽,边回溯边计算当前序列最大的距离(也就是带宽),如果当前带宽超过了当前的最小带宽就剪枝。

注意下,数据读入时的字符串处理。

AC代码

#include<cstdio>
#include<cstring>
int G[26][26];
const char a[27]="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
int n; //记录字母种类数
int v[26],ans[10],res[10],temp[10];
int hard=10;//最终结果 

int turn(char c)
{
    return strchr(a,c)-a;
}

void dfs(int cur,int k)
{
    if(cur==n&&k<hard)
    {
        hard=k;
        for(int i=0;i<n;++i)
        {
            ans[i]=temp[i];
        }
        return ;
    }
    for(int i=0;i<n;++i)
    {
        int ok=1;
        for(int j=0;j<cur;j++)
        {
            if(temp[j]==res[i])
            {
                ok=0;
                break;
            }
        }
        if(ok)
        {
        for(int j=0;j<cur;++j)
        {
            if(G[temp[j]][res[i]])
            {
                if((cur-j)>k)
                k=cur-j;
            }
        }
        if(k<hard)
        {
            temp[cur]=res[i];
            dfs(cur+1,k);
        }
        }
    }
}
int main()
{
    char s[150];
    while(scanf("%s",s)==1&&s[0]!='#')
    {
        n=0,hard=10;
        memset(v,0,sizeof(v));
        memset(G,0,sizeof(G));
        for(int i=0,j=0;;++j)
        {
            if(s[j]==';'||s[j]=='\0')
            {
                int x=turn(s[i]),y=i+2;
                v[x]++;
                while(y!=j)
                {
                    int t=turn(s[y]);
                    G[x][t]=1;
                    G[t][x]=1;
                    ++y;
                    v[t]++;
                }
                i=j+1;
            }
            if(s[j]=='\0')
            break;
        }

        for(int i=0;i<26;++i)
        {
            if(v[i]) res[n++]=i;
        }
    //  printf("%d\n",n); //打印字母个数 

        dfs(0,1);
        for(int i=0;i<n;++i)
        {
        if(i==n-1)
        printf("%c -> %d",'A'+ans[i],hard);
        else printf("%c ",'A'+ans[i]);
        }
        printf("\n");
    }
    return 0;
}

如有不当之处欢迎指出!

uva140的更多相关文章

  1. uva140 - Bandwidth

    Bandwidth Given a graph (V,E) where V is a set of nodes and E is a set of arcs in VxV, and an orderi ...

  2. UVa140 Bandwidth 小剪枝+双射小技巧+枚举全排列+字符串的小处理

    给出一个图,找出其中的最小带宽的排列.具体要求见传送门:UVa140 这题有些小技巧可以简化代码的编写. 本题的实现参考了刘汝佳老师的源码,的确给了我许多启发,感谢刘老师. 思路: 建立双射关系:从字 ...

  3. 假回溯-uva140带宽

    题目链接:https://vjudge.net/problem/UVA-140 题解:这道题利用全排函数即可解决,但是这道题技巧性强,稍微不注意就会超时,一开始没有想起全排函数,自己写回溯全排超时了, ...

  4. Uva140 Bandwidth 全排列+生成测试法+剪枝

    参考过仰望高端玩家的小清新的代码... 思路:1.按字典序对输入的字符串抽取字符,id[字母]=编号,id[编号]=字母,形成双射       2.邻接表用两个vector存储,存储相邻关系     ...

  5. 递归回溯 UVa140 Bandwidth宽带

    本题题意:寻找一个排列,在此排序中,带宽的长度最小(带宽是指:任意一点v与其距离最远的且与v有边相连的顶点与v的距离的最大值),若有多个,按照字典序输出最小的哪一个. 解题思路: 方法一:由于题目说结 ...

  6. UVA140 ——bandwidth(搜索)

    Given a graph (V,E) where V is a set of nodes and E is a set of arcs in VxV, and an ordering on the ...

  7. 7-6 Bandwidth UVA140

    没有清空向量导致debug了好久 这题难以下手  不知道怎么dfs 原来是用排序函数. letter[n]=i; id[i]=n++; 用来储存与设置标记十分巧妙 for(;;) { while(s[ ...

  8. UVa140 Bandwidth 【最优性剪枝】

    题目链接:https://vjudge.net/contest/210334#problem/F  转载于:https://www.cnblogs.com/luruiyuan/p/5847706.ht ...

  9. UVA-140 Bandwidth (回溯+剪枝)

    题目大意:求一个使带宽最小的排列和最小带宽.带宽是指一个字母到其相邻字母的距离最大值. 题目分析:在递归生成全排列的过程中剪枝,剪枝方案还是两个.一.当前解不如最优解优时,减去:二.预测的理想解不必最 ...

随机推荐

  1. Win10微软帐户切换不回Administrator本地帐户的解决方法--(转,虽转但亲测有效)

    在Win10系统中经常会用到微软帐户登录,如应用商店等地方,不过一些用户反馈原来使用Administrator帐户被绑定微软帐户后无法切换回本地帐户,连[改用本地帐户登录]按钮都没有,那么怎么解决呢? ...

  2. DOM中对象的获得

    DOM的所有对象会在页面打开时,由浏览器页面创建. 浏览器把dom定点对象Document对像的引用交给了window对象. 1.document对象的获得    var doc = window.d ...

  3. C# Sap Rfc 连接代码实例

    根据不同的需求,安装不同位数的 Rfc SDK 1.构造 Sap Adress Information,且继承 IDestinationConfiguration public class SapAd ...

  4. ABP官方文档翻译 4.1 应用服务

    应用服务 IApplicationService接口 ApplicationService类 CrudService和AsyncCrudAppService类 简单的CRUD应用服务示例 自定义CRU ...

  5. Could note find result map com.xxxx.entity.UserAccountDO

    原因: insert语句的标签写错:应该是parameterType,而不应该是resultType

  6. 用fiddler2调试localhost

    1.用 http://localhost. (locahost紧跟一个点号): 2.用 http://127.0.0.1. (127.0.0.1紧跟一个点号): 3.用 http://machinen ...

  7. BZOJ 3993: [SDOI2015]星际战争 [二分答案 二分图]

    3993: [SDOI2015]星际战争 题意:略 R1D2T1考了裸二分答案+二分图最大匹配... #include <iostream> #include <cstdio> ...

  8. CF 455D. Serega and Fun [分块 deque]

    Serega and Fun 题意: [l,r]循环右移一位,查询区间内某个数出现次数 为什么好多人用链表?反正我是不会写双向链表 完全可以分块然后模拟啊...中间的块只会插入删除一个元素呀....用 ...

  9. win8 -telnet安装

    控制面板->程序-> 启动或关闭windows功能->选择telnet服务器和telnet客户端->确定 为了安全起见,我们可以设置为手动器用telnet,右键计算机-> ...

  10. git 添加远程仓

    1.新建远程项目 2.提交代码 $ makdir ~/hello-world    //创建一个项目hello-world    $ cd ~/hello-world       //打开这个项目   ...