题意:输入几种指令,让你进行模拟操作,指令如下:

DEPEND item1 item2 (item3 ...) 安装item1需要先安装item2(、item3……)
INSTALL item1 安装item1,如果item1依赖其他组件,则先安装其依赖的其他组件(如果已经安装就不用安装了)
REMOVE item1 移除item1及其依赖的全部组件,如果组件被其他程序依赖,则不移除
LIST 输出当前已安装的所有组件
END 结束程序

析:看到这个题,虽然是放在数据结构这一章里,没觉得有什么数据结构的东西,算法上并不难,只是操作麻烦一点,又是调了好长时间,开始用的1024vector,

RE了,后来我加大了10倍,还有的是后来我看到网上样例不一样都过了,很明显是我没读懂题意,可能移除时顺序是无所谓的。

首先需要的是把每个名字转化成一个id数,我用了两个map,其实可以不用的,那么时间复杂度可能高一点,然后要两个vector,一个存所依赖的组件,一个存依赖于的组件列表。

然后还要用一个数组来记录未安装,还是隐式安装,还是显示安装。安装删除时用递归实现较好。

主要注意以下几点:

  输出比较麻烦,如果已经安装过的显式安装,要输出已经安装了,隐式的直接忽略。

  如果要删除显式安装,除了本身,那么要输出仍然需要。

  如果要删除一个不存在的显式安装,要输出没有安装。

代码如下:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <sstream>
#include <map>
#include <algorithm> using namespace std;
const int maxn = 10240;
vector<int> v1[maxn];
vector<int> v2[maxn];
vector<int> is_install;
map<string, int> mp;
map<int, string> item;
int cnt = 0;
int status[maxn];//0表示未安装,1表示隐式安装,2表示显式安装 int getid(const string &s){//获得id
if(mp.count(s)) return mp[s];
mp[s] = ++cnt;
item[cnt] = s;
return cnt;
} void install(int t, bool ok){
if(status[t] && ok){ cout << " " << item[t] << " is already installed.\n"; return ; }//已经安装过的显式安装,要输出已经安装了
if(status[t]) return ;//隐式安装,忽略 for(int i = 0; i < v1[t].size(); ++i)
install(v1[t][i], false);//递归查找安装
cout << " Installing " << item[t] << endl;
status[t] = ok ? 1 : 2;//确定是隐式安装还是显式安装
is_install.push_back(t);
} bool need(int t){
for(int i = 0; i < v2[t].size(); ++i)
if(status[v2[t][i]]) return true;//这个地方我刚开始写的是 2 == status[v2[t][i]],
//结果不对,因为首先在存储时就已经确定了,存入的都是显式安装的,并不用重新判定,
//只要判定是不是移除了就好,另外的是在安装时实验它的状态可能会改变,所以不能这么写
return false;
} void remove1(int t, bool ok){
if(ok && !status[t]){ cout << " " << item[t] << " is not installed.\n"; return ; }//删除一个不存在的显式安装,要输出没有安装。 if((ok || status[t] == 2) && !need(t)){
status[t] = 0;
is_install.erase(remove(is_install.begin(), is_install.end(), t), is_install.end());//remove不是真删除元素,而是把它们放到后面去,并返回地扯
cout << " Removing " << item[t] << endl;
for(int i = v1[t].size()-1; i >= 0; --i)//这个地方如果从0开始也对,应该是我没读懂题意吧
remove1(v1[t][i], false);
return ;
}
if(ok) cout << " " << item[t] << " is still needed.\n";//删除显式安装,除了本身,那么要输出仍然需要。
} int main(){
// freopen("in.txt", "r", stdin);
string s;
memset(status, 0, sizeof(status));
while(getline(cin, s)){
cout << s << endl;
if(s == "END") break;
stringstream ss(s);
string s1, s2;
ss >> s1;
if('D' == s1[0]){
ss >> s2;
int t = getid(s2);
while(ss >> s){ v1[t].push_back(getid(s)); v2[getid(s)].push_back(t); }
}
else if('I' == s1[0]){
while(ss >> s2) install(getid(s2), true);
}
else if('R' == s1[0]){
ss >> s2; remove1(getid(s2), true);
}
else if('L' == s1[0]){
for(int i = 0; i < is_install.size(); ++i)
cout << " " << item[is_install[i]] << endl;
}
}
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

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

  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++以及编程(细节是必要的,但不是重要的,把时间用在集中精力去解决问题,而不是学习新技术,那样练不成高手。在实践中提高才是最重要的。最最重要的内功还是长期学习所磨练出来的自学能力)good

    最近在学习Qt但由于没有C++的基础,感觉学的很吃力.看到pongba的这篇文章感觉不错就弄过来了, 原文地址:http://blog.csdn.net/qter_wd007/article/deta ...

  7. Perl和操作系统交互(一):system、exec和反引号

    调用操作系统命令:system函数 system函数可以直接让perl调用操作系统中的命令并执行. system入门示例 例如: #!/usr/bin/perl system 'date +" ...

  8. 你应当如何学习C++(以及编程)(转载)

    你应当如何学习C++(以及编程)(rev#1) By 刘未鹏(pongba) C++的罗浮宫(http://blog.csdn.net/pongba) Javascript是世界上最受误解的语言,其实 ...

  9. 《Odoo开发指南》精选分享—第1章-开始使用Odoo开发(1)

    引言 在进入Odoo开发之前,我们需要建立我们的开发环境,并学习它的基本管理任务. 在本章中,我们将学习如何设置工作环境,在这里我们将构建我们的Odoo应用程序.我们将学习如何设置Debian或Ubu ...

随机推荐

  1. xshell 用密钥登录服务器

    来源:http://coolnull.com/3510.html 说明:ssh登录提供两种认证方式:口令(密码)认证方式和密钥认证方式.其中口令(密码)认证方式是我们最常用的一种,这里介绍密钥认证方式 ...

  2. equals方法和==的区别

    equals方法和==的区别   首先大家知道,String既可以作为一个对象来使用,又可以作为一个基本类型来使用.这里指的作为一个基本类型来使用只是指使用方法上的,比如String s = &quo ...

  3. 建立SSH隧道从外网访问内网服务器

    http://blog.trackets.com/2014/05/17/ssh-tunnel-local-and-remote-port-forwarding-explained-with-examp ...

  4. sqlite性能优化

    1.数据库性能上 1.1 批量事务插入,提升数据插入的性能 由于sqlite默认每次插入都是事务,需要对文件进行读写,那么减少事务次数就能简书磁盘读写次数从而获得性能提升. 1.2 单条sql优于多条 ...

  5. java web 程序---注册页面核心代码哈希Map

    收获:在运行程序的时候,错误出现.主要是map没有进行判断,是否为空,如果为空,则创建一个对象new HashMap(); 然后就注意细节, String name=request.getParame ...

  6. sqlnet.ora限制客户端IP访问

    实现功能: 只允许某几个IP访问数据库服务端(白名单): $ORACLE_HOME/network/admin/sqlnet.ora 添加2个主要参数 TCP.VALIDNODE_CHECKING=y ...

  7. canvas设置渐变

    canvas设置渐变 方法 createLinearGradient(x1, y1, x2, y2) 线性渐变 createRadialGradient(x1, y1, r1, x2, y2, r2) ...

  8. Python之分布式监控系统开发

    为什么要做监控? –熟悉IT监控系统的设计原理 –开发一个简版的类Zabbix监控系统 –掌握自动化开发项目的程序设计思路及架构解藕原则 常用监控系统设计讨论 Zabbix Nagios 监控系统需求 ...

  9. Spring Boot实践——Spring Boot 2.0 新特性和发展方向

    出自:https://mp.weixin.qq.com/s/EWmuzsgHueHcSB0WH-3AQw 以Java 8 为基准 Spring Boot 2.0 要求Java 版本必须8以上, Jav ...

  10. MVC-READ2

    框架设计模式 契约式设计.元编程.元数据驱动设计.管道模型.远程代理模式.提供程序模型: