如图
#include<bits/stdc++.h>
using namespace std;
vector<string> split(string& s,char c){
vector<string>ans;
string tmp = "";
for(int i=0;i<s.size();++i){
if(s[i]!=c) tmp+=s[i];
else{
ans.push_back(tmp);
tmp="";
}
}
if(!tmp.empty()) ans.push_back(tmp);
return ans;
}
int main()
{
//拓扑排序的加强版 附加了每个节点的代价
freopen("input.txt","r",stdin);
string s1;
getline(cin,s1);
vector<string>cost = split(s1,',');
int n = cost.size();
vector<int>t(n+1,0);
//每项节点需要的代价
for(int i=0;i<cost.size();++i){
t[i+1]=stoi(cost[i]);
}
//记录每个节点的入度
vector<int>indegree(n+1,0);
string s2;
getline(cin,s2);
//图结构 记录依赖关系
vector<vector<int>>graph(n+1);
vector<string>depend = split(s2,';');
//记录到每个节点的耗费代价 动态更新
vector<int>fee(n+1,0);
for(int i=1;i<=n;++i) fee[i]=t[i];
for(int i=0;i<depend.size();++i){
vector<string>tmp = split(depend[i],',');
for(int j=0;j<tmp.size();++j){
int node = stoi(tmp[j]);
graph[i+1].push_back(node);
indegree[node]++;
}
}
queue<int>q;
for(int k=1;k<=n;++k)
if(indegree[k]==0)
q.push(k);
int ans = 0;
while(!q.empty()){
auto p = q.front();q.pop();
ans = max(ans,fee[p]);
for(auto& a:graph[p]){
//出队时 更新当前元素可达的节点的代价
fee[a]=max(fee[a],fee[p]+t[a]);
if(--indegree[a]==0)
q.push(a);
}
}
cout<<ans<<endl;
return 0;
}

京公网安备 11010502036488号