news 2026/4/18 13:49:36

UVa 140 Bandwidth

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
UVa 140 Bandwidth

题目分析

问题背景

给定一个无向图(V,E)(V, E)(V,E),其中VVV是结点集合,EEE是边集合。现要求给出结点的一个排列(ordering\texttt{ordering}ordering),使得这个排列的“带宽”(bandwidth\texttt{bandwidth}bandwidth)最小。具体定义如下:

  • 对于排列中的每个结点vvv,其带宽定义为vvv与其所有邻接结点在排列中的位置距离的最大值。
  • 整个排列的带宽定义为所有结点带宽的最大值。

例如,题目图示中给出了两种排列方式,带宽分别为666555,目标是找出所有排列中带宽最小的那一个。

输入格式

输入由多组数据组成,每组数据一行,以#结束。每组数据由若干个记录组成,记录之间用分号分隔。每个记录的格式为:

结点:邻居1邻居2...

结点用单个大写字母A-Z表示,图中结点数不超过888个。

输出格式

对于每组数据,输出一行,内容为:

结点1 结点2 ... 结点n -> 带宽

若有多个排列带宽相同,输出字典序最小的那一个。


解题思路

关键约束

  • 结点数≤8\leq 88
  • 带宽定义为排列中任意两个相邻结点之间的最大距离
  • 需要输出字典序最小的最优解。

可行解法

由于结点数最多为888,可以枚举所有可能的排列,计算每个排列的带宽,并记录最小值。结点数888的全排列共有8!=403208! = 403208!=40320种,计算每个排列的带宽是可行的。

算法步骤

  1. 读取一行输入,解析出所有结点及其邻接关系。
  2. 存储结点列表,并排序(为了后续按字典序生成排列)。
  3. 使用next_permutation枚举所有排列。
  4. 对于每个排列,遍历所有边,计算相邻结点在排列中的最大距离,即带宽。
  5. 记录带宽最小的排列,若带宽相同则保留字典序更小的。
  6. 输出结果。

时间复杂度

  • 枚举排列:O(n!)O(n!)O(n!)
  • 计算每个排列的带宽:O(n2)O(n^2)O(n2)(因为需检查所有结点对)
  • 总复杂度:O(n!⋅n2)O(n! \cdot n^2)O(n!n2),在n≤8n \leq 8n8时完全可行。

代码实现

// Bandwidth// UVa ID: 140// Verdict: Accepted// Submission Date: 2016-01-19// UVa Run Time: 0.079s//// 版权所有(C)2016,邱秋。metaphysis # yeah dot net#include<bits/stdc++.h>usingnamespacestd;string nodes;map<char,string>neighbours;intgetBandwidth(){intminBandwidth=1;for(inti=0;i<nodes.length()-1;i++)for(intj=i+1;j<nodes.length();j++)if(neighbours[nodes[i]].find(nodes[j])!=string::npos)if(abs(i-j)>minBandwidth)minBandwidth=abs(i-j);returnminBandwidth;}voidgetNeighbours(string record){for(inti=2;i<record.length();i++){neighbours[record[0]]+=record[i];neighbours[record[i]]+=record[0];}}intmain(){string line;while(getline(cin,line),line!="#"){nodes.clear();neighbours.clear();for(inti=0;i<line.length();i++)if(isalpha(line[i])&&nodes.find(line[i])==nodes.npos)nodes+=line[i];while(line.find(';')!=line.npos){getNeighbours(line.substr(0,line.find(';')));line=line.substr(line.find(';')+1);}getNeighbours(line);sort(nodes.begin(),nodes.end());intminBandwidth=7;string minSequences;minSequences.assign(nodes);do{intbandwidth=getBandwidth();if(bandwidth<minBandwidth){minSequences.assign(nodes);minBandwidth=bandwidth;}}while(next_permutation(nodes.begin(),nodes.end()));for(inti=0;i<minSequences.length();i++)cout<<minSequences[i]<<" ";cout<<"-> "<<minBandwidth<<"\n";}return0;}

总结

本题是一个典型的排列枚举 + 模拟计算问题,由于结点数限制很小,可以直接使用全排列暴力求解。注意在实现时要处理好输入解析和字典序比较的细节。

如果你对图论和排列枚举类问题感兴趣,可以进一步学习回溯剪枝启发式搜索(如模拟退火、遗传算法)在更大规模问题上的应用。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 8:41:45

GLM-4v-9b实战:用AI一键解析图片中的文字和图表

GLM-4v-9b实战&#xff1a;用AI一键解析图片中的文字和图表 你是否遇到过这样的场景&#xff1a; 手里有一张会议现场的PPT截图&#xff0c;密密麻麻全是表格和小字&#xff0c;想快速提取关键数据却要手动抄写&#xff1f;收到客户发来的PDF扫描件&#xff0c;里面是带公式的…

作者头像 李华
网站建设 2026/4/18 0:18:50

移动应用消费创新高,订阅模式驱动收入增长

Appfigures&#xff1a;移动应用支出创下1558亿美元记录 尽管全球应用下载量达到疫情后的低点1069亿次&#xff0c;但应用内购和订阅模式推动了创纪录的收入增长。 Appfigures的年度报告指出&#xff0c;2025年通过某中心应用商店和某机构应用商店进行的全球移动应用和游戏下…

作者头像 李华
网站建设 2026/4/18 0:31:06

【数据驱动】【航空航天结构的高效损伤检测技术】一种数据驱动的结构健康监测(SHM)方法,用于进行原位评估结构健康状态,即损伤位置和程度,在其中利用了选定位置的引导式兰姆波响应(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

作者头像 李华
网站建设 2026/4/18 0:29:18

Java企业级全栈人工智能框架:AI多模型与向量能力解析

html 在Java企业级全栈AI应用开发中&#xff0c;选择合适的框架对于项目的成功至关重要。JBoltAI框架&#xff0c;作为专为Java企业设计的AI应用开发框架&#xff0c;凭借其多模型支持、私有化部署、向量库集成以及强大的Embedding能力&#xff0c;成为了众多开发者的首选。 …

作者头像 李华
网站建设 2026/4/17 15:41:19

TikTok全球宕机原因曝光

TikTok全球宕机原因曝光 为何我们的周末刷屏时光被打断&#xff1f; 最新进展&#xff1a;2026年1月26日美国东部时间下午1:01 TikTok就过去24小时影响美国用户的宕机事件提供了更多细节。TikTok终于迎来了新东家&#xff08;美国资本控股&#xff09;&#xff0c;但应用上线首…

作者头像 李华
网站建设 2026/4/18 0:25:18

CogVideoX-2b场景探索:自动剪辑会议纪要动态视频

CogVideoX-2b场景探索&#xff1a;自动剪辑会议纪要动态视频 1. 为什么会议纪要需要“动起来”&#xff1f; 你有没有遇到过这样的情况&#xff1a;刚开完一场两小时的跨部门会议&#xff0c;会议室白板写满关键词&#xff0c;大家头脑风暴出七八个新点子&#xff0c;但散会后…

作者头像 李华