1 条题解

  • 0
    @ 2024-3-24 16:59:14
    #include <queue>
    #include <math.h>
    #include <stack>
    #include <vector>
    #include <stdio.h>
    #include <iostream>
    #include <vector>
    #include <iomanip>
    #include <string.h>
    #include<cstring>
    #include <algorithm>
    #define LL long long
    const int N = 1e6 + 10;
    const int INF = 0x3f3f3f3f;
    using namespace std;
    int  n , in[N] ;
    int dp[N][2] ;
    int a[N] ;
    vector<int> edg[N] ;
    int dfs(int id , bool flag)
    {
    	if(dp[id][flag])
    		return dp[id][flag] ;
    	for(int i = 0 ; i < edg[id].size() ; i++)
    	{
    		int to = edg[id][i] ;
    		if(flag)
    		{
    			dp[id][flag] += dfs(to,0) ; 
    		}
    		else
    			dp[id][flag] += max(dfs(to,0),dfs(to,1)) ;
    		
    	}
    	if(flag)
    	{
    		dp[id][flag] += a[id] ;
    	}
    	return dp[id][flag] ;
    }
    int main()
    {
    	cin >> n ;
    	for(int i = 1 ; i <= n ; i++)
    	{
    		cin >> a[i] ;
    	} 
    	for(int i = 1 ; i < n ; i++)
    	{
    		int x , y ;
    		cin >> x >> y ;
    		edg[y].push_back(x);
    		in[x]++;
    	}
    	int rt ;
    	for(int i = 1 ; i <= n ; i++)
    	{
    		if(!in[i])
    			rt = i ;
    	}
    	int ans = max( dfs(rt , 0) , dfs(rt , 1) ) ;
    	cout << ans << endl;
    	return 0;
    }
    /***********************************************
    备注:
    
    *************************************************/
    
    • 1

    信息

    ID
    196
    时间
    1000ms
    内存
    128MiB
    难度
    5
    标签
    递交数
    126
    已通过
    51
    上传者