news 2026/6/17 2:25:59

UVa 506 System Dependencies

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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;}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/17 2:14:15

企业级AI工作流编排实战:5大核心架构设计与实施策略

企业级AI工作流编排实战&#xff1a;5大核心架构设计与实施策略 【免费下载链接】Awesome-Dify-Workflow 分享一些好用的 Dify DSL 工作流程&#xff0c;自用、学习两相宜。 Sharing some Dify workflows. 项目地址: https://gitcode.com/GitHub_Trending/aw/Awesome-Dify-Wo…

作者头像 李华
网站建设 2026/6/17 2:11:23

有交易经验但不会代码,怎么把一个想法拆成信号?

有交易经验的人&#xff0c;往往不缺想法。真正难的是把想法拆到程序能执行。手工交易时&#xff0c;一句话就能概括的判断&#xff0c;到了量化里要变成数据、条件、信号、动作和例外情况。比如“突破以后追一下”&#xff0c;听起来很简单。但程序需要知道突破什么、追多少、…

作者头像 李华
网站建设 2026/6/17 2:09:53

从零搭建Java萌宠社交系统:WebSocket实时聊天+动态发布模块实现

在宠物社交类项目开发中&#xff0c;用户动态分享、好友实时聊天是最核心的两大基础功能。传统的HTTP请求属于短连接&#xff0c;无法实现消息实时推送&#xff0c;很难满足社交场景的交互需求。因此在萌宠社交系统开发中&#xff0c;我们通常会基于SpringBoot整合WebSocket&am…

作者头像 李华
网站建设 2026/6/17 2:02:55

RyuSAK:一站式Switch模拟器管理工具,轻松打造完美游戏体验

RyuSAK&#xff1a;一站式Switch模拟器管理工具&#xff0c;轻松打造完美游戏体验 【免费下载链接】RyuSAK 项目地址: https://gitcode.com/gh_mirrors/ry/RyuSAK RyuSAK是一款基于Electron开发的开源Switch模拟器管理工具&#xff0c;专门为Ryujinx模拟器用户设计&…

作者头像 李华
网站建设 2026/6/17 2:02:14

学术初级认识

第一章 Java 概述1.1 Java 起源与发展1. 研发背景 1991年Sun Microsystems启动Green项目&#xff0c;负责人James Gosling&#xff08;高斯林&#xff0c;Java之父&#xff09;&#xff0c;目标为家电、机顶盒等嵌入式设备开发轻量化编程语言。- 初代语言命名Oak&#xff08;办…

作者头像 李华