UVa140 Bandwidth(带宽)

news2024/11/16 18:47:28

1、题目

在这里插入图片描述

2、题意

给出一个 n ( n ≤ 8 ) n(n≤8) nn8个结点的图G和一个结点的排列,定义结点 i i i 的带宽 b ( i ) b(i) b(i) i i i 和相邻结点在排列中的最远距离,而所有 b ( i ) b(i) b(i) 的最大值就是整个图的带宽。给定图G,求出让带宽最小的结点排列,如图所示。
在这里插入图片描述
下面两个排列的带宽分别为6和5。具体来说,图7-8(a)中各个结点的带宽分别为6, 6,1, 4, 1, 1, 6, 6,图7-8(b)中各个结点的带宽分别为5, 3, 1, 4, 3, 5, 1, 4。

在这里插入图片描述

3、分析

如果不考虑效率,本题可以递归枚举全排列,分别计算带宽,然后选取最小的一种方案。能否优化呢?和八皇后问题不同的是:八皇后问题有很多可行性约束(feasibility constraint),可以在得到完整解之前避免扩展那些不可行的结点,但本题并没有可行性约束——任何排列都是合法的。难道只能扩展所有结点吗?当然不是。

可以记录下目前已经找到的最小带宽 k k k。如果发现已经有某两个结点的距离大于或等于 k k k,再怎么扩展也不可能比当前解更优,应当强制把它“剪”掉,就像园丁在花园里为树修剪枝叶一样,也可以为解答树“剪枝(prune)”。

除此之外,还可以剪掉更多的枝叶。如果在搜索到结点 u u u 时, u u u 结点还有 m m m 个相邻点没有确定位置,那么对于结点 u u u 来说,最理想的情况就是这 m m m 个结点紧跟在 u u u 后面,这样的结点带宽为 m m m,而其他任何“非理想情况”的带宽至少为 m + 1 m+1 m+1。这样,如果 m ≥ k m≥k mk,即“在最理想的情况下都不能得到比当前最优解更好的方案”,则应当剪枝。

提示:在求最优解的问题中,应尽量考虑最优性剪枝。这往往需要记录下当前最优解,并且想办法“预测”一下从当前结点出发是否可以扩展到更好的方案。具体来说,先计算一下最理想情况可以得到怎样的解,如果连理想情况都无法得到比当前最优解更好的方案,则剪枝

4、代码实现

#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;

const int maxn = 10;
int id[256], letter[maxn];

int main() {
	char input[1000];
  	while(scanf("%s", input) == 1 && input[0] != '#') {
    	// 计算结点个数并给字母编号
    	int n = 0;
    	for(char ch = 'A'; ch <= 'Z'; ch++)
      		if(strchr(input, ch) != NULL) {
        		id[ch] = n++;
        		letter[id[ch]] = ch;
      		}

		// 处理输入
    	int len = strlen(input), p = 0, q = 0;
    	vector<int> u, v;
   		for(;;) {
      		while(p < len && input[p] != ':') p++;
      		if(p == len) break;
      		while(q < len && input[q] != ';') q++;
      		for(int i = p+1; i < q; i++) {
        		u.push_back(id[input[p-1]]);
       			v.push_back(id[input[i]]);
      		}
      		p++; q++;
    	}

    	// 枚举全排列
    	int P[maxn], bestP[maxn], pos[maxn], ans = n;
    	for(int i = 0; i < n; i++) P[i] = i;
    	do {
			for(int i = 0; i < n; i++) pos[P[i]] = i; // 每个字母的位置
	      	int bandwidth = 0;
      		for(int i = 0; i < u.size(); i++)
        		bandwidth = max(bandwidth, abs(pos[u[i]] - pos[v[i]])); // 计算带宽
      		if(bandwidth < ans) {
        		ans = bandwidth;
        		memcpy(bestP, P, sizeof(P));
      		}
    	} while(next_permutation(P, P+n));

    	// 输出
    	for(int i = 0; i < n; i++) printf("%c ", letter[bestP[i]]);
    	printf("-> %d\n", ans);
  	}
  	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1142822.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Ansible上通过roles简化playbook演示介绍

目录 一.roles介绍 1.作用 2.role的目录结构 3.role和tasks的执行优先级顺序 二.自定义一个httpd的角色 1.完整目录结构展示 2.主要的各个目录配置 &#xff08;1&#xff09;vars目录和templates目录 &#xff08;2&#xff09;tasks目录和handlers目录 &#xff08…

操作系统中套接字和设备独立性软件的关系

网络编程就是编写程序让两台联网的计算机相互交换数据。在我们不需要考虑物理连接的情况下&#xff0c;我们只需要考虑如何编写传输软件。操作系统提供了名为“套接字”&#xff0c;套接字是网络传输传输用的软件设备。 这是对软件设备的解释&#xff1a; 在操作系统中&#…

Unity ScrollView最底展示

Unity ScrollView最底展示 问题方案逻辑 问题 比如在做聊天界面的时候我们肯定会使用到ScrollView来进行展示我们的聊天内容&#xff0c;那么这个时候来新消息的时候就需要最底展示&#xff0c;我认为这里有两种方案&#xff1b; 一种是通过算法每一条预制体的高度*一共多少…

轮转数组(Java)

大家好我是苏麟 , 这篇文章是凑数的 ... 轮转数组 描述 : 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 题目 : 牛客 NC110 旋转数组: 这里牛客给出了数组长度我们直接用就可以了 . LeetCode 189.轮转数组 : 189. 轮…

Python---break关键字对for...else结构的影响

for循环中添加else结构 循环可以和else配合使用&#xff0c; else下方缩进的代码指的是当循环正常结束之后要执行的代码。 强调&#xff1a; 循环 正常结束&#xff0c;else之后要执行的代码。 非正常结束&#xff0c;其else中的代码是不会执行的。&#xff08;如遇到br…

类和对象(1):类,对象,this指针

面向过程和面向对象初步认识&#xff1a; C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出问题求解的步骤&#xff0c;用函数调用逐步解决。C是基于面向对象的&#xff0c;关注的是对象&#xff0c;将一件事情拆分成不同的对象&#xff0c;靠对象之间的交互完成。…

【.NET Core】创建一个在后台运行的控制台程序(ConsoleApp)

文章目录 1. 添加Nuget包2. 修改Program.cs3. 添加TestService 借助.NET的通用主机&#xff08;IHostBuilder&#xff09;可以轻易创建一个可以执行后台任务的程序 1. 添加Nuget包 Microsoft.Extensions.Hosting 2. 修改Program.cs 通过Host获取IHostService&#xff0c;然…

SSD: Single Shot MultiBox Detector(2016.11)

文章目录 AbstractIntroduction此前本文贡献总结如下: The Single Shot Detector (SSD)SSD ModelMulti-scale feature maps for detectionConvolutional predictors for detectionDefault boxes and aspect ratiosTrainingMatching strategyTraining objectiveChoosing scales …

python---for循环结构中的else结构(是同级关系)

为什么需要在for循环中添加else结构 循环可以和else配合使用&#xff0c; else下方缩进的代码指的是当循环正常结束之后要执行的代码。 强调&#xff1a; 循环 正常结束&#xff0c;else之后要执行的代码。 非正常结束&#xff0c;其else中的代码是不会执行的。&#xf…

GienTech动态|入选软件和信息技术服务名牌企业;荣获城市数字化转型优秀案例;参加第四届深圳国际人工智能展

中电金信入选“2023第二届软件和信息技术服务名牌企业” 近日&#xff0c;中国电子信息行业联合会发布了“2023第二届软件和信息技术服务名牌企业”名单&#xff0c;中电金信入选。此名单发布原则&#xff0c;重点突出技术创新力。突出市场影响力&#xff0c;品牌建设良好&…

Leetcode刷题笔记--Hot81--90

1--打家劫舍III 主要思路&#xff1a; 基于从下到上的 dp 回溯法&#xff0c;每一个节点只有两种状态&#xff0c;dp[0]表示被打劫&#xff0c;dp[1]表示不被打劫&#xff1b; 当前节点被打劫时&#xff0c;其孩子只能都不被打劫&#xff1b;dp[0] left[1] right[1] cur->…

redis集群理论和搭建

目录 环境 一&#xff0c;安装和部署redis 1&#xff0c;安装 2&#xff0c;部署 ​编辑 3&#xff0c;允许非本机连接redis 二、主从模式 主从模式搭建&#xff1a; 三&#xff0c;哨兵模式 哨兵模式搭建 四&#xff0c;集群模式 架构细节: 心跳机制 集群模式搭建&#xff1a…

【NLP】word复制指定内容到新的word文档

目录 1.python代码 2.结果 需求&#xff1a; 复制word文档里的两个关键字&#xff08;例如“起始位置”到“结束位置”&#xff09;之间的内容到新的word文档。 前提&#xff1a;安装win32包&#xff0c;通过pip install pywin32命令直接安装。话不多说&#xff0c;直接上代码…

底层全部重构,小米澎湃OS完整系统架构公布

上周&#xff0c;雷军发文称小米全新操作系统澎湃 OS 正式版已完成封包&#xff0c;将逐步接替 MIUI。而后&#xff0c;又有网友曝光小米澎湃 OS 界面。 今日&#xff0c;雷军再度发表长文预热小米澎湃 OS&#xff0c;正式公布了完整系统架构。 据介绍&#xff0c;从架构设计之…

CSS基础入门03

目录 1.圆角矩形 1.1基本用法 1.2生成圆形 1.3生成圆角矩形 1.4展开写法 2.Chrome 调试工具--查看 CSS 属性 2.1打开浏览器 2.2标签页含义 2.3elements 标签页使用 3.元素的显示模式 3.1块级元素 3.2行内元素/内联元素 3.3行内元素和块级元素的区别 3.4改变显示模…

Leetcode刷题详解——寻找峰值

1. 题目链接&#xff1a;162. 寻找峰值 2. 题目描述&#xff1a; 峰值元素是指其值严格大于左右相邻值的元素。 给你一个整数数组 nums&#xff0c;找到峰值元素并返回其索引。数组可能包含多个峰值&#xff0c;在这种情况下&#xff0c;返回 任何一个峰值 所在位置即可。 你可…

Zabbix监控IP地址是否畅通

一、fping安装 1.下载fping安装包 wget http://www.fping.org/dist/fping-4.0.tar.gz下载失败的&#xff0c;请看 https://download.csdn.net/download/qq_45748758/88477979 资源包已上传&#xff0c;免费 2.解压安装包 tar -xf fping-4.0.tar.gz3.安装 cd fping-4.0 ./c…

在HTML当中引入Vue控件,以element-ui为例

前情&#xff1a;需要实现一个同时满足按天、按周、按月选择的时间选择器&#xff0c;但是以HTML为基础写的都不太满足我的要求&#xff0c;要么只能按天选择&#xff0c;要么就是想选择久远的时间得点很久&#xff0c;除非自己写捷径&#xff0c;所以就看上了element-ui的这个…

【开源】基于SpringBoot的计算机机房作业管理系统的设计和实现

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 登录注册模块2.2 课程管理模块2.3 课时管理模块2.4 学生作业模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 课程表3.2.2 课时表3.2.3 学生作业表 四、系统展示五、核心代码5.1 查询课程数据5.2 新增课时5.3 提交作…

Linux中shell的执行流控制

目录 一、for语句 1、for语句的基本格式 2、示例 二、条件语句 1、while…do语句 2、until…do语句 3、if …then语句 4、示例 三、case语句 四、expect应答语句 1、固定答案 2、将expect与bash环境结合 3、示例 五、终止语句 一、for语句 作用&#xff1a;为…