Uva - 506 - System Dependencies
模拟题,注意显示安装和隐式安装,显示安装的必须显示显示删除。把名字转化为整数维护。其他注意都注释了。输入稍微多一下,题目不是很麻烦。
AC代码:
#include <iostream> #include <cstdio> #include <cstdlib> #include <cctype> #include <cstring> #include <string> #include <sstream> #include <vector> #include <set> #include <map> #include <algorithm> #include <stack> #include <queue> #include <bitset> #include <cassert> using namespace std; const int maxn = 10000; int cnt = 0; map<string, int> name2id; // 把名字转化为整数,方便处理 string name[maxn]; vector<int> depend[maxn]; // 组件x所以来的组件列表 vector<int> depended[maxn]; // 依赖于x的组件列表 int status[maxn]; // 0表示组件x未安装,1表示显示安装,2表示隐式安装 vector<int> installed; // 存放安装过的组件,安装过的就不要再安装了 // 把名字转化为整数维护 int ID(const string& item) { if (!name2id.count(item)) { name[++cnt] = item; name2id[item] = cnt; } return name2id[item]; } // 是否有组件依赖于item bool needed(int item) { for (int i = 0; i < depended[item].size(); i++) { if (status[depended[item][i]]) { return true; } } return false; } // 安装item,如果有依赖项,递归的继续安装 void install(int item, bool toplevel) { if (!status[item]) { for (int i = 0; i < depend[item].size(); i++) { install(depend[item][i], false); } cout << " Installing " << name[item] << endl; status[item] = toplevel ? 1 : 2; installed.push_back(item); } } // 判断是否能删除,如果能,删除之后递归的删除其他所依赖的组件 void remove(int item, bool toplevel) { if ((toplevel || status[item] == 2) && !needed(item)) { status[item] = 0; installed.erase(remove(installed.begin(), installed.end(), item), installed.end()); cout << " Removing " << name[item] << endl; for (int i = 0; i < depend[item].size(); i++) { remove(depend[item][i], false); } } } // 按照安装顺序输出 void list() { for (int i = 0; i < installed.size(); i++) { cout << " " << name[installed[i]] << endl; } } int main() { ios::sync_with_stdio(false); string line, cmd; memset(status, 0, sizeof(status)); while (getline(cin, line)) { cout << line << endl; stringstream ss(line); ss >> cmd; if (cmd[0] == 'E') { break; } string item1, item2; if (cmd[0] == 'L') { list(); } else { ss >> item1; int i1 = ID(item1); if (cmd[0] == 'D') { while (ss >> item2) { int i2 = ID(item2); depend[i1].push_back(i2); depended[i2].push_back(i1); } } else if (cmd[0] == 'I') { if (status[i1]) { cout << " " << item1 << " is already installed.\n"; } else { install(i1, true); } } else { if (!status[i1]) { cout << " " << item1 << " is not installed.\n"; } else if (needed(i1)) { cout << " " << item1 << " is still needed.\n"; } else { remove(i1, true); } } } } return 0; }
Uva - 506 - System Dependencies的更多相关文章
- 【STL+模拟】UVa 506 - System Dependencies
System Dependencies Components of computer systems often have dependencies--other components that m ...
- UVa 506 System Dependencies (细节问题)
题意:输入几种指令,让你进行模拟操作,指令如下: DEPEND item1 item2 (item3 ...) 安装item1需要先安装item2(.item3……) INSTALL item1 安装 ...
- UVA 506 System Dependencies(模拟 烂题)
https://vjudge.net/problem/UVA-506 题目是给出了五种指令,DEPEND.INSTALL.REMOVE.LIST.END,操作的格式及功能如下: DEPEND item ...
- Learning ROS: Managing System dependencies
Download and install the system dependencies for turtlesim: roscd turtlesim cat package.xml rosdep i ...
- 【例题 6-21 UVA - 506】System Dependencies
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 记录每个物品它的依赖有哪些,以及它被哪些东西依赖就可以了. 显式安装的东西不能被隐式删除删掉(就是remove item,然后删除i ...
- C C++ TDD单元测试非常好的书
http://product.china-pub.com/199003 测试驱动的嵌入式C语言开发 Test Driven Development for Embedded C <测试驱动的嵌入 ...
- Debian8.3.0下安装Odoo8.0步骤
Debian8.3.0下安装Odoo8.0的方法 假设你已经安装好了Debian 系统,使用root帐号执行如下命令 # apt-get update && apt-get upgra ...
- Classes
Class Organization Following the standard Java convention, a class should begin with a list of varia ...
- maven-dependency-plugin插件的使用
maven-dependency-plugin插件的使用 maven-dependency-plugin是 处理与依赖相关的插件.它有很多可用的goal,大部分是和依赖构建.分析和解决相关的goa ...
随机推荐
- 传统方法过渡到ES6去优雅地实现JavaScript的继承
众所周知,面向对象编程有三个重要的概念: 封装.继承.多态.而JS作为面向对象的弱类型语言,应该说是基于对象的语言,正如常说的,JS的世界里,万物皆对象.虽然JS本身不是面向对象的语言,我们可以通过模 ...
- JS中数组和字符串的方法大全
数组的方法很多,ECMScript5又提供了好几种方法.有空把之前的云上的笔记整理了一下,方便自己以后查找使用. 一.ECMScript 3的Array.prototype中定义的方法 1.join( ...
- Laravel中构造方法中不能写return!!!
今天遇到的大坑 在laravel中 __construct 这个方法中不能写return 完全不能返回 而且还会向下执行具体原因不知道为什么解决办法!!!!用中间件来实现就可以了 Over!!!
- python学习之路网络编程篇(第四篇)
python学习之路网络编程篇(第四篇) 内容待补充
- python笔记十五(面向对象及其特性)
一.面向对象: class(类):一类拥有共同属性对象的抽象:定义了这些对象的属性和方法object(对象):是一个类实例化后的实例,类必须经过实例化才可以在程序中调用: 由于之前学习过java,对类 ...
- PHP While 循环
PHP 循环 - While 循环 循环执行代码块指定的次数,或者当指定的条件为真时循环执行代码块. PHP 循环 在您编写代码时,您经常需要让相同的代码块一次又一次地重复运行.我们可以在代码中使用循 ...
- PHP 5 MySQLi 函数
在 PHP 中使用 MySQLi 函数需要注意的是:你需要添加对 MySQLi 扩展的支持. PHP MySQLi 简介 PHP MySQLi = PHP MySQL Improved! MySQLi ...
- Docker 内核名字空间
Docker 容器和 LXC 容器很相似,所提供的安全特性也差不多.当用 docker run 启动一个容器时,在后台 Docker 为容器创建了一个独立的名字空间和控制组集合. 名字空间提供了最基础 ...
- Redis之(一)初识Redis
1.Redis概述 我们知道,内存是电脑主板上的存储部件,用于存储当前正在使用的数据和程序,CPU可以与内存直接沟通,所以访问速速非常高:而外存数据必须加载到内存以后程序才能使用.如果把CPU当做一个 ...
- LauncherModel.Callbacks接口
public interface Callbacks { //如果Launcher在加载完成之前被强制暂停,那么需要通过这个回调方法通知 //launcher,在它再次显示的时候重新执行加载过程 pu ...