模拟题,注意显示安装和隐式安装,显示安装的必须显示显示删除。把名字转化为整数维护。其他注意都注释了。输入稍微多一下,题目不是很麻烦。

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的更多相关文章

  1. 【STL+模拟】UVa 506 - System Dependencies

    System Dependencies  Components of computer systems often have dependencies--other components that m ...

  2. UVa 506 System Dependencies (细节问题)

    题意:输入几种指令,让你进行模拟操作,指令如下: DEPEND item1 item2 (item3 ...) 安装item1需要先安装item2(.item3……) INSTALL item1 安装 ...

  3. UVA 506 System Dependencies(模拟 烂题)

    https://vjudge.net/problem/UVA-506 题目是给出了五种指令,DEPEND.INSTALL.REMOVE.LIST.END,操作的格式及功能如下: DEPEND item ...

  4. Learning ROS: Managing System dependencies

    Download and install the system dependencies for turtlesim: roscd turtlesim cat package.xml rosdep i ...

  5. 【例题 6-21 UVA - 506】System Dependencies

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 记录每个物品它的依赖有哪些,以及它被哪些东西依赖就可以了. 显式安装的东西不能被隐式删除删掉(就是remove item,然后删除i ...

  6. C C++ TDD单元测试非常好的书

    http://product.china-pub.com/199003 测试驱动的嵌入式C语言开发 Test Driven Development for Embedded C <测试驱动的嵌入 ...

  7. Debian8.3.0下安装Odoo8.0步骤

    Debian8.3.0下安装Odoo8.0的方法 假设你已经安装好了Debian 系统,使用root帐号执行如下命令 # apt-get update && apt-get upgra ...

  8. Classes

    Class Organization Following the standard Java convention, a class should begin with a list of varia ...

  9. maven-dependency-plugin插件的使用

    maven-dependency-plugin插件的使用   maven-dependency-plugin是 处理与依赖相关的插件.它有很多可用的goal,大部分是和依赖构建.分析和解决相关的goa ...

随机推荐

  1. Mysql各种引擎原理实战对比

    1)存储引擎概述: (2)MySQL各大存储引擎: (3)InnoDB和MyIsam使用及其原理对比: (4)InnoDB和MyIsam引擎原理: (5)剩余引擎的使用DEMO(主要是Mrg_Myis ...

  2. solr服务器搭建

    百度百科定义:Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口.用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引:也可以通过Ht ...

  3. Junit4 java.lang.Exception: No runnable methods

    出现如下错误: java.lang.Exception: No runnable methods at org.junit.runners.BlockJUnit4ClassRunner.validat ...

  4. 检测linux vps是xen openvz还是kvm的方法

    很多时候不知道自己买的vps是那种虚拟化技术,怕给商家忽悠了,下面给大家介绍下怎么简单的判断自己vps的虚拟化技术. 1.通过系统上的相关目录或文件判断 ll /proc/   ps: /proc目录 ...

  5. Docker端口映射实现

    默认情况下,容器可以主动访问到外部网络的连接,但是外部网络无法访问到容器. 容器访问外部实现 容器所有到外部网络的连接,源地址都会被NAT成本地系统的IP地址.这是使用 iptables 的源地址伪装 ...

  6. 利用github webhook 结合openresty自动更新静态博客

    使用hexo在github pages上弄了一个静态博客,后来觉得访问有点慢,于是放到自己vps上. 对于静态博客的部署非常简单,本来就是html,js,css等静态文件,只要nginx上配置下目录就 ...

  7. 微信小程序基础之开源项目库汇总

    awesome-github-wechat-weapp 是由OpenDigg整理并维护的微信小程序开源项目库集合.我们会定期同步OpenDigg上的项目到这里,也欢迎各位提交项目给我们. (链接:ht ...

  8. log file sync 因为数据线有问题而造成高等侍的表现

    这是3月份某客户的情况,原因是服务器硬件故障后进行更换之后,业务翻译偶尔出现提交缓慢的情况.我们先来看下awr的情况. 我们可以看到,该系统的load profile信息其实并不高,每秒才21个tra ...

  9. 浅析"Sublabel-Accurate Relaxation of Nonconvex Energies" CVPR 2016 Best Paper Honorable Mention

    今天作了一个paper reading,感觉论文不错,马克一下~ CVPR 2016 Best Paper Honorable Mention "Sublabel-Accurate Rela ...

  10. Python Tkinter小试

    前两天看到一篇关于Python使用Tkinter 的博文,写的很好.就拿来研究了一下,改了改.现分享如下: 参考 代码 # coding:utf8 # python2.73 winxp ''''' 天 ...