news 2026/6/10 19:49:12

UVa 124 Following Orders

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
UVa 124 Following Orders

题目描述

给定一组形式为x < y x < yx<y的变量约束条件,要求输出所有满足这些约束条件的变量排列。变量均为单个小写字母,每个测试用例包含至少2 22个、至多20 2020个变量,以及至少1 11个、至多50 5050个约束条件。满足条件的排列数量在1 11300 300300之间。输入以文件结束(EOF \texttt{EOF}EOF)终止,每个测试用例的输出之间用空行分隔,排列需按字典序(字母序)输出。

输入格式

每个测试用例由两行组成:

  • 第一行:变量列表(字符间用空格分隔)
  • 第二行:约束条件列表,每对x y x \\ yxy表示x < y x < yx<y

输出格式

每个测试用例输出所有满足约束的排列,每行一个,按字典序排列。不同测试用例的输出之间用一个空行分隔。

样例输入

a b f g a b b f w u x y z v y x v z v w v

样例输出

abfg abgf agbf gabf wzxyy wzxyy xwzyy xzwyy zuxvy zxwy

题目分析

本题本质上是拓扑排序的枚举问题:给定一个有向图(变量为节点,约束x < y x < yx<y为有向边x → y x \to yxy),要求输出所有可能的拓扑序列,且按字典序输出。

由于变量数量最多为20 2020,约束最多为50 5050,可能的排列数不超过300 300300,因此我们可以采用回溯法(Backtracking \texttt{Backtracking}Backtracking结合剪枝来生成所有满足条件的排列。

核心思路

  1. 建模

    • 将变量视为图中的节点。
    • 每个约束x < y x < yx<y对应一条从x xx指向y yy的有向边。
    • 我们需要输出所有拓扑排序(即满足所有约束的线性顺序)。
  2. 算法选择

    • 使用深度优先搜索(DFS \texttt{DFS}DFS)回溯生成排列。
    • 在生成排列的过程中,检查当前部分排列是否违反约束,若违反则提前剪枝。
    • 为了按字典序输出,首先对变量列表进行排序,然后在回溯时按顺序尝试变量。
  3. 剪枝策略

    • 记录每个变量在已生成排列中的位置。
    • 每添加一个变量,检查所有约束条件:如果某个约束x < y x < yx<yx xxy yy都已出现在排列中,且x xx的位置大于等于y yy的位置,则当前排列无效,回溯。
    • 这样可以在早期排除无效分支,减少搜索空间。
  4. 时间复杂度

    • 最坏情况下需要生成所有拓扑排序,数量不超过300 300300,回溯搜索的剪枝效果较好,实际运行效率可以接受。

解题步骤

  1. 读取变量列表,排序以保证输出字典序。
  2. 读取约束条件,存储为边的列表。
  3. 初始化访问标记数组visited \texttt{visited}visited和位置数组value \texttt{value}value
  4. 从第一个位置开始回溯生成排列:
    • 若当前排列长度达到n nn,输出。
    • 否则,按变量顺序尝试每个未使用的变量,放入当前位。
    • 更新位置信息,检查约束是否满足。
    • 递归下一层,回溯时恢复状态。
  5. 每个测试用例输出后打印空行(最后一个除外)。

代码实现

// Following Orders// UVa ID: 124// Verdict: Accepted// Submission Date: 2015-11-27// UVa Run Time: 0.000s//// 版权所有(C)2015,邱秋。metaphysis # yeah dot net#include<bits/stdc++.h>usingnamespacestd;#defineMAXN20boolvisited[MAXN];intnChar,value[2*MAXN],nLimit;charoutput[MAXN],input[MAXN],limit[MAXN][2];voidprint(){for(inti=0;i<nChar;i++)cout<<output[i];cout<<endl;}boolisValid(){for(inti=0;i<nLimit;i++)if(value[limit[i][0]-'a']>=0&&value[limit[i][1]-'a']>=0&&value[limit[i][0]-'a']>value[limit[i][1]-'a'])returnfalse;returntrue;}voidlexicographical(intcurrent){if(current>=2&&!isValid())return;if(current==nChar){print();return;}for(inti=0;i<nChar;i++)if(!visited[i]){visited[i]=true;output[current]=input[i];value[input[i]-'a']=current;lexicographical(current+1);value[input[i]-'a']=-1;visited[i]=false;}}boolcmp(chara,charb){returna<b;}intmain(intac,char*av[]){string line;intcases=0;while(getline(cin,line),line.length()>0){// 输出间隔空行。if(cases>0)cout<<endl;// 读取字符,初始化相关变量。istringstreamfirst(line);nChar=0;while(first>>input[nChar]){output[nChar]=0;visited[nChar]=false;nChar++;}for(inti=0;i<2*MAXN;i++)value[i]=-1;sort(input,input+nChar,cmp);// 读取限制。nLimit=0;getline(cin,line);istringstreamnext(line);while(next>>limit[nLimit][0])next>>limit[nLimit++][1];// 使用回溯生成字典序排列然后检查是否符合限制条件。lexicographical(0);cases++;}return0;}

总结

本题是一道典型的拓扑排序枚举问题,通过回溯法生成所有可能的排列,并利用约束条件进行剪枝,从而在合理时间内得到结果。需要注意输出格式(字典序、空行分隔)和边界条件(变量数、约束数、排列数)。代码实现简洁,剪枝策略有效,能够在给定的限制下快速求解。

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

Windows截图工具终极解决方案:QQScreenShot完整使用指南

Windows截图工具终极解决方案&#xff1a;QQScreenShot完整使用指南 【免费下载链接】QQScreenShot 电脑QQ截图工具提取版,支持文字提取、图片识别、截长图、qq录屏。默认截图文件名为ScreenShot日期 项目地址: https://gitcode.com/gh_mirrors/qq/QQScreenShot 还在为W…

作者头像 李华
网站建设 2026/6/9 18:45:21

MGeo调优指南:如何在预置环境快速实验超参数

MGeo调优指南&#xff1a;如何在预置环境快速实验超参数 参加AI竞赛时&#xff0c;很多选手会遇到这样的困境&#xff1a;官方提供的MGeo基础模型在测试集上F1值只有0.82&#xff0c;而比赛时间有限&#xff0c;如何快速尝试不同训练策略提升效果&#xff1f;本文将分享我在预置…

作者头像 李华
网站建设 2026/6/9 20:13:24

从零开始掌握岛屿设计:Happy Island Designer终极操作指南

从零开始掌握岛屿设计&#xff1a;Happy Island Designer终极操作指南 【免费下载链接】HappyIslandDesigner "Happy Island Designer (Alpha)"&#xff0c;是一个在线工具&#xff0c;它允许用户设计和定制自己的岛屿。这个工具是受游戏《动物森友会》(Animal Cross…

作者头像 李华
网站建设 2026/6/9 18:43:55

Venera漫画阅读器深度解析:架构设计与性能优化实战

Venera漫画阅读器深度解析&#xff1a;架构设计与性能优化实战 【免费下载链接】venera A comic app 项目地址: https://gitcode.com/gh_mirrors/ve/venera Venera作为一款开源漫画阅读器&#xff0c;其架构设计体现了现代Flutter应用的最佳实践。本文将从源码层面深度解…

作者头像 李华
网站建设 2026/6/9 19:57:49

5大AI音频神器:零基础打造专业级音效

5大AI音频神器&#xff1a;零基础打造专业级音效 【免费下载链接】openvino-plugins-ai-audacity A set of AI-enabled effects, generators, and analyzers for Audacity. 项目地址: https://gitcode.com/gh_mirrors/op/openvino-plugins-ai-audacity 还在为音频质量不…

作者头像 李华
网站建设 2026/6/9 15:12:18

Chrome-Charset终极指南:高效解决网页乱码问题的完整方案

Chrome-Charset终极指南&#xff1a;高效解决网页乱码问题的完整方案 【免费下载链接】Chrome-Charset An extension used to modify the page default encoding for Chromium 55 based browsers. 项目地址: https://gitcode.com/gh_mirrors/ch/Chrome-Charset 还在为网…

作者头像 李华