U . System Dependencies
题目给出了四种命令,depend(后面的部分是说第一个依赖后面的),install(安装所给任务的依赖环境),remove(删除环境),list(输出环境);
只需要对这几种操作模拟就可以了。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
vector<int> aa[10001],b[10001];
map<string,int> m;
string name[10001];
int x[10001];
vector<int> in;
int len=0;
void f(string s) {
if(!m.count(s)) {
m[s]=len;
name[len++]=s;
}
}
void ff(int id,bool top) {
if(!x[id]) {
ll z=aa[id].size();
for(int i=0; i<z; i++)
ff(aa[id][i],0);
cout << " Installing " << name[id] <<endl;
if(top)
x[id]=1;
else
x[id]=2;
in.push_back(id);
}
}
bool fff(int id) {
ll z=b[id].size();
for(int i=0; i<z; i++)
if(x[b[id][i]])
return 1;
return 0;
}
void ffff(int id,bool top) {
if((top||x[id]==2)&!fff(id)) {
x[id]=0;
cout << " Removing " << name[id] <<endl;
in.erase(remove(in.begin(),in.end(),id),in.end());
for(int i = 0; i<aa[id].size() ; i++)
ffff(aa[id][i], false);
}
}
int main() {
string s;
while(getline(cin,s) ) {
stringstream ss(s);
cout<<s<<endl;
if(s=="END") break;
ss>>s;
if(s=="DEPEND") {
ss>>s;
f(s);
string a;
while(ss>>a) {
f(a);
aa[m[s]].push_back(m[a]);
b[m[a]].push_back(m[s]);
}
} else if(s=="INSTALL") {
ss>>s;
f(s);
if(!x[m[s]]) ff(m[s],1);
else cout<<" "<<name[m[s]]<<" is already installed."<<endl;
} else if(s=="REMOVE") {
ss>>s;
if(!x[m[s]]) cout<<" "<<s<<" is not installed."<<endl;
else {
if(fff(m[s])) cout<<" "<<name[m[s]]<<" is still needed."<<endl;
else ffff(m[s],true);
}
} else if(s=="LIST") {
for(int i=0; i<in.size(); i++)
if(x[in[i]])
cout<<" "<<name[in[i]]<<endl;
}
}
return 0;
}