uva140
全排列回溯剪枝。
题目数据很水。记录当前最小带宽,边回溯边计算当前序列最大的距离(也就是带宽),如果当前带宽超过了当前的最小带宽就剪枝。
注意下,数据读入时的字符串处理。
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的更多相关文章
- 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 ...
- UVa140 Bandwidth 小剪枝+双射小技巧+枚举全排列+字符串的小处理
给出一个图,找出其中的最小带宽的排列.具体要求见传送门:UVa140 这题有些小技巧可以简化代码的编写. 本题的实现参考了刘汝佳老师的源码,的确给了我许多启发,感谢刘老师. 思路: 建立双射关系:从字 ...
- 假回溯-uva140带宽
题目链接:https://vjudge.net/problem/UVA-140 题解:这道题利用全排函数即可解决,但是这道题技巧性强,稍微不注意就会超时,一开始没有想起全排函数,自己写回溯全排超时了, ...
- Uva140 Bandwidth 全排列+生成测试法+剪枝
参考过仰望高端玩家的小清新的代码... 思路:1.按字典序对输入的字符串抽取字符,id[字母]=编号,id[编号]=字母,形成双射 2.邻接表用两个vector存储,存储相邻关系 ...
- 递归回溯 UVa140 Bandwidth宽带
本题题意:寻找一个排列,在此排序中,带宽的长度最小(带宽是指:任意一点v与其距离最远的且与v有边相连的顶点与v的距离的最大值),若有多个,按照字典序输出最小的哪一个. 解题思路: 方法一:由于题目说结 ...
- 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-6 Bandwidth UVA140
没有清空向量导致debug了好久 这题难以下手 不知道怎么dfs 原来是用排序函数. letter[n]=i; id[i]=n++; 用来储存与设置标记十分巧妙 for(;;) { while(s[ ...
- UVa140 Bandwidth 【最优性剪枝】
题目链接:https://vjudge.net/contest/210334#problem/F 转载于:https://www.cnblogs.com/luruiyuan/p/5847706.ht ...
- UVA-140 Bandwidth (回溯+剪枝)
题目大意:求一个使带宽最小的排列和最小带宽.带宽是指一个字母到其相邻字母的距离最大值. 题目分析:在递归生成全排列的过程中剪枝,剪枝方案还是两个.一.当前解不如最优解优时,减去:二.预测的理想解不必最 ...
随机推荐
- promise使用方法
代码报错会走向失败时的回调 let p = new Promise((resolve, reject) => { throw new Error("我错了"); //会失败 ...
- 日历插件——laydate.js
laydate是一款很好用的日历控件,兼容了包括IE6在内的所有主流浏览器,默认有三种皮肤,如需其它皮肤可去官网下载http://www.layui.com/laydate/ 一.核心方法:layd ...
- PHP如何读取json数据
1的 <?php $json = '{"a":1,"b":2,"c":3,"d":4,"e": ...
- awk的批量replace功能
awk的批量replace功能 需求 现在需要替换一个文本 文本内容如下 $cat file MD_D1TS_1_060_I MD_D1TS_1_061_F MD_D1TS_1_062_U MD_D1 ...
- grep的小技巧
grep '^[^#]' /etc/openvpn/server.conf 中括号必须匹配一个字符^$属于标志位,不属于字符 grep没把\n看成字符 grep把空行看成^$ 还是perl的标准,空行 ...
- 【Thinkphp 5】 整合邮箱类 phpmailer实现邮件发送
第一步:下载phpmailer文件,主要用到的文件只有箭头指向的两个,thinkphp5中,把class.phpmailer.php改成了phpmailer.php 第二步: 将phpmailer文件 ...
- sqlserver数据库使用技巧(一)--限制数据库的大小
如何限制数据库的大小? 随着数据库的使用,他占用的空间会越来越大,为了便于资源的合理分配和管理,我们可以限制其最大的大小,这个建议只在测试环境使用 具体操作如下: 打开sqlserver数据库管理工具 ...
- [TFRecord格式数据]利用TFRecords存储与读取带标签的图片
利用TFRecords存储与读取带标签的图片 原创文章,转载请注明出处~ 觉得有用的话,欢迎一起讨论相互学习~Follow Me TFRecords其实是一种二进制文件,虽然它不如其他格式好理解,但是 ...
- PyCharm配置autopep8,自动格式化Python代码
1. 关于PEP 8 PEP 8,Style Guide for Python Code,是Python官方推出编码约定,主要是为了保证 Python 编码的风格一致,提高代码的可读性. 官网地址:h ...
- Centos6.5离线安装lsb_release
参考 http://www.linuxfromscratch.org/blfs/view/systemd/postlfs/lsb-release.html首先在其他电脑下载lsb_release源码地 ...