博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
例题7-6 UVa140 Bandwidth(枚举+剪枝)
阅读量:6890 次
发布时间:2019-06-27

本文共 1341 字,大约阅读时间需要 4 分钟。

题意:

看白书

要点:

就是全排列问题加上一些剪枝,输入存储有些麻烦。注意如果有多个最小的排列,输出字典序最小的那个

#include 
#include
#include
#include
#include
#include
using namespace std;int num, ahl[30], map[30][30];int save[10], node[10];char a[500];int main(){ int len, max,c; while (scanf("%s",a)!=EOF) { if (!strcmp(a, "#")) break; max = 10;num = 0; int flag = 0; len = strlen(a); memset(ahl, 0, sizeof(ahl)); memset(map, 0, sizeof(map)); for (int i = 0; i < len; i++) { if (isalpha(a[i])) ahl[a[i] - 'A'] = 1; if (a[i] == ':') { c = a[i-1] - 'A';//这里是i-1,第一次错在这里调试半天 flag = 1; } else if (flag&&isalpha(a[i])) map[c][a[i] - 'A'] = map[a[i] - 'A'][c] = 1;//存储邻接的点 else if (a[i] == ';') flag = 0; } for (int i = 0; i < 26; i++)//按照字母表排序,已经字典序最小 if (ahl[i]) node[num++] = i; do { int ans = 0;; for (int i = 0; i < num; i++) { for (int j = i+1; j < num; j++) { if (map[node[i]][node[j]]) if (abs(i - j)>ans) ans = abs(i - j);//取当前排列的最大值 } if (ans > max)//剪枝,如果当前算出的值已经大于max,说明这种排列肯定不是最小的那种 break; } if (ans < max) { max = ans; memcpy(save, node, sizeof(node)); } } while (next_permutation(node, node + num));//直接用下一个排列,因为一开始是最小的所以保证了输出字典序最小的 for (int i = 0; i < num; i++) printf("%c ", save[i] + 'A'); printf("-> %d\n",max); } return 0;}

转载于:https://www.cnblogs.com/seasonal/p/10343829.html

你可能感兴趣的文章
centos7安装使用samba服务器免密码登录简单配置
查看>>
mysql中if-elesif-endif使用
查看>>
drbd状态信息详细说明
查看>>
apache详解
查看>>
闲聊 -软路由的安装
查看>>
PHP中利用COOKIE与SESSION联合实现SESSION跨域
查看>>
error:Microsoft Visual C++ 9.0 is required. Get it
查看>>
Mininal Desktop安装CentOS 6.4后编译安装Mplayer
查看>>
好马不回头策略
查看>>
函数声明后面的const用法
查看>>
CUDA中自动初始化显卡设备宏
查看>>
application
查看>>
spring中加载xml配置文件的方式 .
查看>>
ruby参考
查看>>
斐波那契数列c语言实现
查看>>
emacs使修改的配置文件立即生效方法
查看>>
查询表中没有的字段信息
查看>>
stm32 使用 printf 串口输出 配置
查看>>
java 同步锁 synchronized 死锁 lock锁 jion 线程结束
查看>>
jsf开发心得(3)-jsf应用中css运用背景图片显示不了的问题
查看>>