UVa 792 Program Modules

发布时间:2026/11/3 18:57:13

UVa 792 Program Modules 题目描述给定一个程序中的所有函数及其直接调用关系定义关系A→BA \rightarrow BA→B表示函数AAA直接调用BBBA⇒BA \Rightarrow BA⇒B表示AAA可传递地调用BBB直接或间接。已知→\rightarrow→是⇒\Rightarrow⇒的子集且⇒\Rightarrow⇒具有传递性。现需要将所有函数划分为若干模块满足若A⇒BA \Rightarrow BA⇒B且B⇒AB \Rightarrow AB⇒A则AAA与BBB必须在同一模块。任意两个不满足上述条件的函数必须分属不同模块。要求输出所有模块每个模块内的函数名按字典序升序排列模块按第一个元素最小函数名的字典序升序排列。每组数据输出后跟一个空行。输入格式输入包含若干组数据每组数据代表一个待模块化的程序。每组数据格式为(Fun1 Fun11 ... Fun1n1)(Fun2 Fun21 ... Fun2n2)... (Funm Funm1 ... Funmn m).其中每个括号项表示源函数FuniFun_iFuni​直接调用其后所有函数FunijFun_{ij}Funij​j1..nij 1..n_ij1..ni​。函数名由字母组成区分大小写。括号之间、函数名之间可以有任意数量的空格、制表符或换行。每组数据以句点.结尾输入正确每个函数恰好出现在一个项的左侧同一项内函数名互不相同。如果一组数据不含任何括号则表示空函数集例如仅一个.。输出格式对于每组数据输出若干行每行一个模块内的函数名升序排列空格分隔。模块之间按各自最小函数名的字典序升序输出。每组数据的输出结束后必须输出一个空行即使该组没有函数也要输出一个空行。样例输入. (a a) (a b) (b). (a b c) (b a e) (c d) (d d) (e b).输出a b a b e c d题目分析规则1\texttt{1}1和规则2\texttt{2}2共同定义了模块的划分标准若两个函数相互可达即A⇒BA \Rightarrow BA⇒B且B⇒AB \Rightarrow AB⇒A则它们必须在同一模块否则绝对不能在同一模块。这正是有向图中强连通分量Strongly Connected Component\texttt{Strongly Connected Component}Strongly Connected Component,SCC\texttt{SCC}SCC的定义。因此将每个函数看作节点直接调用关系A→BA \rightarrow BA→B看作从AAA到BBB的有向边则一个模块即对应一个强连通分量。由于⇒\Rightarrow⇒是→\rightarrow→的传递闭包同一强连通分量内的任意两个节点相互可达符合规则 1不同强连通分量之间的节点不存在双向可达路径符合规则2\texttt{2}2。因此问题转化为给定有向图求所有强连通分量并按题目要求排序输出。解题思路图构建首先需从输入中提取每个函数及其直接调用列表。输入为自由格式但以句点.分隔每组数据。我们可以先读入整个数据集直到遇到.为一个字符串再通过查找括号(和)来提取每个括号内的内容。每个括号内部是一个空格分隔的单词序列第一个单词为源函数其余为目标函数。为每个函数分配唯一编号建立邻接表。强连通分量求解使用Tarjan\texttt{Tarjan}Tarjan算法求SCC\texttt{SCC}SCC。该算法通过一次深度优先搜索DFS\texttt{DFS}DFS记录每个节点的dfn\textit{dfn}dfn访问次序和low\textit{low}low能回溯到的最早祖先。当dfn[u]low[u]\textit{dfn}[u] \textit{low}[u]dfn[u]low[u]时栈中从栈顶到uuu的所有节点构成一个强连通分量。复杂度为O(VE)O(V E)O(VE)其中VVV为函数数EEE为直接调用边数。排序与输出每个SCC\texttt{SCC}SCC内部函数名按字典序排序整个SCC\texttt{SCC}SCC列表按其最小函数名的字典序排序。输出时每个SCC\texttt{SCC}SCC占一行函数名用空格分隔末尾换行。每组数据结束后额外输出一个空行。复杂度分析解析输入每个字符或单词读入一次时间复杂度O(输入总长度)O(\text{输入总长度})O(输入总长度)。建图每个括号项处理一次总边数EEE时间复杂度O(E)O(E)O(E)。Tarjan\texttt{Tarjan}TarjanO(VE)O(V E)O(VE)。排序每个SCC\texttt{SCC}SCC内部排序总代价O(∑kilog⁡ki)≤O(Vlog⁡V)O(\sum k_i \log k_i) \le O(V \log V)O(∑ki​logki​)≤O(VlogV)外部排序O(Clog⁡C)O(C \log C)O(ClogC)CCC为SCC\texttt{SCC}SCC数量C≤VC \le VC≤V。总时间复杂度O(VEVlog⁡V)O(V E V \log V)O(VEVlogV)空间复杂度O(VE)O(V E)O(VE)。代码实现// Program Modules// UVa ID: 792// Verdict: Accepted// Submission Date: 2026-07-09// UVa Run Time: 0.300s//// 版权所有C2026邱秋。metaphysis # yeah dot net#includebits/stdc.husingnamespacestd;vectorstringsplitByWhitespace(conststrings){vectorstringtokens;stringstreamss(s);string token;while(sstoken)tokens.push_back(token);returntokens;}intmain(){ios::sync_with_stdio(false);cin.tie(nullptr);string data,token;while(cintoken){datatoken;while(1){if(token.back().)break;cintoken;data token;}vectorstringnames;unordered_mapstring,intidMap;vectorvectorintg;autogetNode[](conststringname)-int{autoitidMap.find(name);if(it!idMap.end())returnit-second;intnewId(int)names.size();idMap[name]newId;names.push_back(name);g.push_back({});returnnewId;};size_t pos0;while(true){size_t leftdata.find((,pos);if(leftstring::npos)break;size_t rightdata.find(),left1);string innerdata.substr(left1,right-left-1);vectorstringtokenssplitByWhitespace(inner);if(tokens.empty()){posright1;continue;}intsrcIdgetNode(tokens[0]);for(size_t i1;itokens.size();i){inttIdgetNode(tokens[i]);g[srcId].push_back(tId);}posright1;}intnnames.size();vectorintdfn(n,0),low(n,0),sccId(n,-1),stk;vectorcharinStack(n,0);inttimer0,sccCnt0;functionvoid(int)tarjan[](intu){dfn[u]low[u]timer;stk.push_back(u);inStack[u]1;for(intv:g[u]){if(!dfn[v]){tarjan(v);low[u]min(low[u],low[v]);}elseif(inStack[v]){low[u]min(low[u],dfn[v]);}}if(low[u]dfn[u]){sccCnt;while(true){intvstk.back();stk.pop_back();inStack[v]0;sccId[v]sccCnt;if(vu)break;}}};for(inti0;in;i)if(!dfn[i])tarjan(i);vectorvectorstringsccNodes(sccCnt1);for(inti0;in;i)sccNodes[sccId[i]].push_back(names[i]);for(inti1;isccCnt;i)sort(sccNodes[i].begin(),sccNodes[i].end());vectorintorder(sccCnt);iota(order.begin(),order.end(),1);sort(order.begin(),order.end(),[](inta,intb){returnsccNodes[a][0]sccNodes[b][0];});for(intidx:order){for(intj0;j(int)sccNodes[idx].size();j){if(j)cout ;coutsccNodes[idx][j];}cout\n;}cout\n;}return0;}总结本题本质是图论中的强连通分量求解直接应用Tarjan\texttt{Tarjan}Tarjan算法即可。关键点在于正确解析输入格式将自由格式的括号表达式转化为有向图。输出部分需注意排序规则模块内升序、模块间按最小元素升序和每组数据后的空行。此题提醒我们复杂问题往往能归结为经典算法只要准确建模实现并不困难。
延伸阅读

更多相关文章

2026/11/3 18:57:13

UVa 771 Flying Stars

题目描述 给定若干机场以及每日循环的航班信息。每个机场有固定的时区偏移和登机 / 转机耗时。从起点机场的某个本地时刻出发,需要经过一系列航班抵达终点机场。要求计算从出发时刻到抵达终点时刻的总旅行时间(以天、小时、分钟表示)&#xf…

2026/11/3 18:57:13

政务文稿场景中,AI辅助工具能做什么、不能做什么

组织人事和政务文稿工作有几个共同点:材料多、标准严、容错低、重复性工作占比高。AI辅助工具确实可以分担一部分工作,但它更适合做初筛、初稿和整理,不适合直接替代最终审核。一、文档校对:适合做规则检查,不适合做最…

2026/11/3 19:52:23

OpenHarmony与sfsEdgeStore集成实战:边缘存储优化方案

1. OpenHarmony与sfsEdgeStore集成概述在分布式操作系统领域,OpenHarmony作为开源项目正逐步构建起自己的生态系统。而sfsEdgeStore作为一种边缘存储解决方案,其与OpenHarmony的深度集成将为分布式应用带来全新的数据存取范式。这种组合特别适合需要低延…

2026/11/3 19:52:23

C语言文件读写避坑:fopen/fclose与缓冲区实战

简介:这份面向C语言初学者的文件读写入门文档,围绕文件指针、标准库函数调用和文本文件处理流程展开,帮助刚接触持久化存储的读者理解打开、写入、读取与关闭文件的基本方法,并建立对返回值和错误检查的初步认识。压缩包内共1个do…

2026/11/3 19:52:23

HarmonyOS多角度3D物体观察技术实现与优化

1. 项目概述:多角度观察物体的HarmonyOS实现在智能设备交互领域,多角度观察功能正在成为提升用户体验的重要技术手段。这个HarmonyOS应用实例通过设备传感器和图形渲染技术,实现了对3D物体的多视角交互观察。不同于传统的单视角展示&#xff…

2026/11/3 19:52:23

Linux静态库与动态库开发实战指南

1. Linux库的基本概念与分类在Linux系统开发中,库(Library)是代码复用和模块化开发的核心组件。作为一名长期从事Linux开发的工程师,我发现很多初学者对库的理解停留在表面。今天我们就深入探讨库的本质、工作原理和实际应用场景。…

2026/11/3 19:52:23

AI创意预测技术解析与广告行业应用

1. 项目概述:AI创意分析行业的战略并购阳狮集团近期完成对AdgeAI的收购,标志着传统广告巨头向数据驱动型创意决策的转型迈出关键一步。作为全球Top3的传播集团,这次并购并非简单的资本运作,而是对"创意生产-效果预测"全…

2026/11/3 19:47:23

CSP真题解析:算法思维与状态建模的实战训练

简介:本资源是面向CCF-CSP认证考生的真题精解学习材料,聚焦算法设计与编程实战能力提升,特别适合计算机专业学生及算法初学者系统备考。内容涵盖2014—2023年共6套高频真题(如‘小明上学’‘卖菜’‘跳一跳’‘相反数’‘仓库规划…

2026/11/3 7:47:06

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/3 14:24:53

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/3 1:04:48

STM32实战:基于MAX14431数字隔离器的SPI隔离通信方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/3 1:04:48

工业SPI隔离通信设计:MAX14431BAEE+与STM32L4A6RG实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/3 1:04:48

STM32+NRF24L01无线抢答器:硬件设计、通信协议与低功耗实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/3 7:47:06

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/3 14:24:53

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑