#include <iostream>
#include<stdlib.h>
#include <vector>
using namespace std;
const int MAX=1e5+5;
//struct edge{
// int to=0;
// int next=0;
// int w;//代表时间
//}e[MAX];
//int head[MAX];
//int cnt;
//void add(int u,int v){
// e[++cnt].to=v;
// e[cnt].next=head[u];
// head[u]=cnt;
//}
inline int read(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch)){x=x*10+ch-48;ch=getchar();}
return x*f;
//快读
}
//vector<vector<int> >g;
//vector<int> informTime;vector数组读入请用push_back,please!
vector<int>g[MAX];
int informTime[MAX];
int dp[MAX];//dp[i]表示以i为根节点的子树的通知时间
void dfs(int id){
if(g[id].size()==0){
return;
}
dp[id]+=informTime[id];//通知给所有的孩子只需要一次informTime
int maxt=0;
for(int i=0;i<g[id].size();i++){
int s=g[id][i];
dfs(s);
maxt=max(maxt,dp[s]);
// dp[id]+=dp[s];//所有的孩子通知下去是同时进行的
}
dp[id]+=maxt;
}
int main(){
int n,headID;//节点个数n,编号0->n-1
int f,t;
cin>>n>>headID;
for(int i=0;i<n;i++){
// cin>>f;
f=read();
if(f!=-1)g[f].push_back(i);//父亲指向儿子,反正f也是0-n之间
}
for(int i=0;i<n;i++){
// cin>>t;
t=read();
informTime[i]=t;
}
dfs(headID);
cout<<dp[headID];
return 0;
}
输入
7 0
-1 0 0 1 3 2 5
1 2 5 2 0 1 0
输出
7
以下代码搞不出来
#include <iostream>
#include<stdlib.h>
#include <vector>
using namespace std;
const int MAX=1e5+5;
struct edge{
int to=0;
int next=0;
int w;//代表时间
}e[MAX];
int head[MAX];
int cnt;
void add(int u,int v){
e[++cnt].to=v;
e[cnt].next=head[u];
head[u]=cnt;
}
vector<int> manager;
vector<int> informTime;
void dfs(vector<vector<int> >&g,vector<int>&informTime,int id,int time,int&ans){
if(g[id].size()==0){
ans=max(ans,time);
}
time+=informTime[id];
for(int i=0;i<g[id].size();i++){
dfs(g,informTime,id,time,ans);
}
}
int numOfMinutes(int n,int headID,vector<int>& manager,vector<int>&informTime){
vector<vector<int> >g;//二维数组
for(int i=0;i<n;i++){
if(manager[i]==-1)continue;//总负责人没有领导
g[i].push_back(manager[i]);//邻接矩阵职员指向它的领导
}
int ans=0;
dfs(g,informTime,headID,0,ans);
}
int main(){
int n,headID;//节点个数n,编号0->n-1
int f,t;
cin>>n>>headID;
for(int i=0;i<n;i++){
cin>>f;
manager[i]=f;
}
for(int i=0;i<n;i++){
cin>>t;
informTime[i]=t;
}
numOfMinutes(n,headID,manager,informTime);
return 0;
}