当前位置: 首页 > news >正文

UVa 506 System Dependencies

题目描述

题目要求模拟软件组件的安装和移除过程。每个组件可能有依赖关系(必须预先安装其他组件)。安装命令可以显式或隐式安装组件,移除命令只能移除不再被需要的组件。需要根据命令执行相应的操作并输出结果。

输入格式

输入包含若干命令,每行一个命令。命令类型有:

  • DEPEND item1 item2 [item3 ...]:定义依赖关系,item1item1item1依赖于item2item2item2item3item3item3等。
  • INSTALL item:安装itemitemitem及其依赖(若尚未安装)。
  • REMOVE item:移除itemitemitem(若未被其他组件依赖且不是显式安装)。
  • LIST:列出所有已安装的组件(按安装顺序)。
  • END:结束当前测试用例。

组件名称不超过101010个字符,区分大小写。依赖关系在INSTALL之前定义,无循环依赖。输入以END结束。

输出格式

对于每个命令,先原样输出命令本身。对于INSTALLREMOVE,输出执行的动作(每行以三个空格开头)。对于LIST,输出所有已安装组件(每行以三个空格开头)。对于DEPENDEND,不输出额外内容。具体输出格式见样例。

样例

输入

DEPEND TELNET TCPIP NETCARD DEPEND TCPIP NETCARD DEPEND DNS TCPIP NETCARD DEPEND BROWSER TCPIP HTML INSTALL NETCARD INSTALL TELNET INSTALL foo REMOVE NETCARD INSTALL BROWSER INSTALL DNS LIST REMOVE TELNET REMOVE NETCARD REMOVE DNS REMOVE NETCARD INSTALL NETCARD REMOVE TCPIP REMOVE BROWSER REMOVE TCPIP END

输出

DEPEND TELNET TCPIP NETCARD DEPEND TCPIP NETCARD DEPEND DNS TCPIP NETCARD DEPEND BROWSER TCPIP HTML INSTALL NETCARD Installing NETCARD INSTALL TELNET Installing TCPIP Installing TELNET INSTALL foo Installing foo REMOVE NETCARD NETCARD is still needed. INSTALL BROWSER Installing HTML Installing BROWSER INSTALL DNS Installing DNS LIST NETCARD TCPIP TELNET foo HTML BROWSER DNS REMOVE TELNET Removing TELNET REMOVE NETCARD NETCARD is still needed. REMOVE DNS Removing DNS REMOVE NETCARD NETCARD is still needed. INSTALL NETCARD NETCARD is already installed. REMOVE TCPIP TCPIP is still needed. REMOVE BROWSER Removing BROWSER Removing HTML Removing TCPIP REMOVE TCPIP TCPIP is not installed. END

题目分析

本题的核心是维护组件的依赖关系和安装状态,模拟安装和移除过程。

数据结构

  • explicitly:记录显式安装的组件。
  • installed:记录已安装的组件及其安装序号。
  • sequence:按安装序号存储组件名称。
  • depend:每个组件的依赖列表。
  • referencedBy:每个组件被哪些组件依赖。

安装逻辑

  • 递归安装组件的所有依赖(先依赖后自身)。
  • 若组件已安装,则跳过。
  • 显式安装的组件标记为显式。

移除逻辑

  • 若组件未被任何其他组件依赖,且不是显式安装(或允许隐式移除),则可移除。
  • 移除后,递归检查其依赖是否可移除。

命令处理

  • DEPEND:记录依赖关系。
  • INSTALL:若已安装则输出already installed,否则调用安装函数。
  • REMOVE:若未安装则输出not installed,若仍被需要则输出still needed,否则调用移除函数。
  • LIST:按安装顺序输出所有组件。

复杂度分析

每个命令处理复杂度O(依赖数)O(\text{依赖数})O(依赖数),总复杂度可接受。

代码实现

// System referredencies// UVa ID: 506// Verdict: Accepted// Submission Date: 2017-04-25// UVa Run Time: 0.000s//// 版权所有(C)2017,邱秋。metaphysis # yeah dot net#include<bits/stdc++.h>usingnamespacestd;intindexer=0;// index of itemsmap<string,bool>explicitly;// explicitly installed itemsmap<string,int>installed;// installed items include explicitly and implicitlymap<int,string>sequence;// installed items with ordermap<string,vector<string>>depend;// item1 depends item2, item3, ...map<string,set<string>>referencedBy;// item1 referenced by item2, item3, ...voidinstall(string software,booltopmost){for(autocomponent:depend[software]){referencedBy[component].insert(software);install(component,false);}if(installed.find(software)==installed.end()){cout<<" Installing "<<software<<'\n';installed.insert(make_pair(software,indexer));sequence.insert(make_pair(indexer,software));indexer++;if(topmost)explicitly[software]=true;}}voidremove(string software,booltopmost){if((topmost||!explicitly[software])&&referencedBy[software].size()==0){cout<<" Removing "<<software<<'\n';sequence.erase(installed[software]);installed.erase(software);referencedBy.erase(software);if(topmost)explicitly[software]=false;for(autocomponent:depend[software]){referencedBy[component].erase(software);if(referencedBy[software].size()==0&&!explicitly[software])remove(component,false);}}}voidparse(string line){string action,software,component;istringstreamiss(line);iss>>action;if(action=="DEPEND"){iss>>software;while(iss>>component)depend[software].push_back(component);}elseif(action=="INSTALL"){iss>>software;if(installed.find(software)!=installed.end())cout<<" "<<software<<" is already installed.\n";elseinstall(software,true);}elseif(action=="REMOVE"){iss>>software;if(installed.find(software)==installed.end())cout<<" "<<software<<" is not installed.\n";else{if(referencedBy[software].size()>0)cout<<" "<<software<<" is still needed.\n";elseremove(software,true);}}elseif(action=="LIST"){for(autos:sequence)cout<<" "<<s.second<<'\n';}}intmain(intargc,char*argv[]){cin.tie(0),cout.tie(0),ios::sync_with_stdio(false);string line;while(getline(cin,line)){if(line!="END"){do{cout<<line<<'\n';if(line=="END")break;parse(line);}while(getline(cin,line));}indexer=0;explicitly.clear();installed.clear();sequence.clear();depend.clear();referencedBy.clear();}return0;}
http://www.jsqmd.com/news/1027068/

相关文章:

  • 2026年膜结构厂家怎么选?五大维度官方推荐甄选指南 - 优质品牌商家
  • 国产AI编程工具选型指南:代码零出域与本地化部署实战
  • macOS读写NTFS磁盘终极方案:Mounty 2.x安装配置与排错指南
  • 2026年6月17日成都钢材市场板材代理商价格行情及市场分析 - 四川盛世钢联营销中心
  • 嵌入式GUI开发实战:从PEG图形栈到驱动集成与性能优化
  • 德州房屋渗漏水检测维修、卫生间漏水免砸砖维修、漏水点精准检测、厨房漏水防水补漏、正规防水补漏公司、口碑榜TOP5靠谱推荐、本地人必选的防水维修公司 - 安佳防水
  • 3步掌握EPPlus:.NET Excel自动化处理的终极秘籍
  • 选元明粉厂家前要搞清楚的4个核心维度
  • Cornucopia-LLaMA金融大模型:中文金融领域指令微调架构设计与实现原理
  • AI 代码审查工具横评:谁在认真找 Bug,谁在装模作样
  • 2026年6月17日成都钢材市场管材代理商价格行情及市场分析 - 四川盛世钢联营销中心
  • C#WinForm BinaryWriter、BinaryReader 二进制读写+BufferedStream 缓存流读写+File类+StreamReader与StreamWriter 读写流
  • G-Helper完整指南:5分钟掌握华硕笔记本性能优化
  • 李飞飞下场定调世界模型:渲染、仿真、规划
  • 基于USDPAA的FRA应用部署与测试:释放QorIQ处理器数据平面性能
  • 常德房屋渗漏水检测维修、卫生间漏水免砸砖维修、漏水点精准检测、厨房漏水防水补漏、正规防水补漏公司、口碑榜TOP5靠谱推荐、本地人必选的防水维修公司 - 安佳防水
  • 什么是HPC?HPC包括哪些关键技术?
  • 广州房屋渗漏水检测维修、卫生间漏水免砸砖维修、漏水点精准检测、厨房漏水防水补漏、正规防水补漏公司、口碑榜TOP5靠谱推荐、本地人必选的防水维修公司 - 安佳防水
  • Scan Tailor:基于C++/Qt的扫描文档处理架构与算法实现
  • 如何选择靠谱的有机肥袋厂家?关键指标解析
  • Marketch终极指南:如何将Sketch设计秒变HTML代码
  • 使用Codex 的 Superpowers + Product Design 快速生成交互式原型
  • 来自教授的有用链接 — 21
  • 2026年更新:厦门超大件FBA头程物流口岸报关,如何选择高性价比服务商? - 品牌鉴赏官2026
  • 计算机毕业设计之双十一淘宝直播大盘数据分析
  • 多标签分类实战指南:从原理、评估到工程落地
  • 2026年 南通废酸处理系统/盐酸浓缩/盐酸解析/硫酸浓缩最新推荐:高效节能与绿色环保标杆之选 - 品牌发掘
  • BOSS 直聘上每条 JD 都写“熟练使用 Git 进行版本控制“,实习生到底要会到什么程度
  • 一杯好咖啡怎么选?雀巢全系指南破解你的选择焦虑
  • 2026年成都幕墙玻璃改开窗品牌甄选:本地化服务与专业能力的多维对比 - 优质品牌商家