UVA 506 System Dependencies(模拟 烂题)

https://vjudge.net/problem/UVA-506

  题目是给出了五种指令,DEPEND、INSTALL、REMOVE、LIST、END,操作的格式及功能如下:

 

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



  INSTALL指令中作为参数的组件的安装是显式安装,其所依赖的组件的安装不是显示安装。被显式安装的组件只能通过REMOVE指令显式删除,而移除中的组件如果当前被其他显式安装的组件直接或间接地依赖,则不能通过REMOVE移除。

  每当输入指令之后,先原样输出一遍指令,然后执行指令。安装组件时如果可以安装组件则需输出“Installing 组建名”。如果显式安装时组件已被安装则提示“组建名 is already installed.”,隐式安装则无需提示。如果显式删除组件时组件未被安装则提示“组建名 is not installed.”,如果组件被其他组件依赖则提示“组建名 is still needed.”,隐式卸载则无需提示。

  其实就是个用STL做的复杂模拟,纯属吃力不讨好的题目,并学不到什么算法思想,唯一的亮点就是为一个组件建立依赖和被依赖两个列表,其他的操作模拟即可。

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <string>
 4 #include <sstream>
 5 #include <set>
 6 #include <vector>
 7 #include <stack>
 8 #include <map>
 9 #include <queue>
10 #include <deque>
11 #include <cstdlib>
12 #include <cstdio>
13 #include <cstring>
14 #include <cmath>
15 #include <ctime>
16 #include <functional>
17 using namespace std;
18 
19 int cnt = 0, status[maxn];  
20 vector<int> depend[maxn], depend2[maxn];  
21 vector<int> installed;  
22 string name[maxn];  
23   
24 int get_id(const string & x)  
25 {  
26     for (int i = 0; i < cnt; i++)  
27         if (name[i] == x)  
28             return i;  
29     name[cnt++] = x;  
30     return cnt-1;  
31 }  
32   
33 void instal(int item, bool top)  
34 {  
35     if (!status[item]){  
36         for (size_t i = 0; i < depend[item].size(); i++)  
37             instal(depend[item][i], false);  
38         cout << "   Installing " << name[item] << endl;  
39         status[item] = top ? 1 : 2;  
40         installed.push_back(item);  
41     }  
42     else if(top)  
43         cout << "   " << name[item] << " is already installed." << endl;  
44 }  
45   
46 bool needed(int item)  
47 {  
48     for (size_t i = 0; i < depend2[item].size(); i++)  
49         if (status[depend2[item][i]])  
50             return true;  
51     return false;  
52 }  
53   
54 void Remove(int item, bool top)  
55 {  
56     if(top && status[item]==0)  
57         cout << "   " << name[item] << " is not installed." << endl;  
58     else if(top && needed(item))  
59         cout << "   " << name[item] << " is still needed." << endl;  
60     else if ((top || status[item] == 2) && !needed(item)){  
61         status[item] = 0;  
62         installed.erase(remove(installed.begin(), installed.end(), item), installed.end());  
63         cout << "   Removing " << name[item] << endl;  
64         for (size_t i = 0; i < depend[item].size(); i++)  
65             Remove(depend[item][i], false);  
66     }  
67 }  
68   
69 int main()  
70 {  
72     ios::sync_with_stdio(false);  
73     string line;  
74     while (getline(cin, line), line != "END")  
75     {  
76         cout << line << endl;  
77         stringstream ss(line);  
78         if (line[0] == 'L'){  
79             for (size_t i = 0; i != installed.size(); ++i)  
80                 cout << "   " << name[installed[i]] << endl;  
81         }  
82         else{  
83             string t1, t2, t3;  
84             ss >> t1 >> t2;  
85             if (t1[0] == 'D'){  
86                 while (ss >> t3){  
87                     depend[get_id(t2)].push_back(get_id(t3));  
88                     depend2[get_id(t3)].push_back(get_id(t2));  
89                 }  
90             }  
91             else if (t1[0] == 'I')  
92                 instal(get_id(t2), true);  
93             else if (t1[0] == 'R')  
94                 Remove(get_id(t2), true);  
95         }  
96     }  
97     cout << "END" << endl;  
98     return 0;  
99 }  
原文地址:https://www.cnblogs.com/YingZhixin/p/7512930.html