树形DP——CF 767C Garland

树形DP——CF 767C Garland

这道题是通过dfs来对树进行搜索,同时在回溯的过程中来记录每个点的子树的总温度大小(所有子树的温度总和+这个子树的根节点的温度)。通过子树来更新当前子树的动态规划。

#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
const int MAXN = 1e6+10;
struct Edge{
    int u, v, next;
}edge[MAXN<<1];
int head[MAXN];
int tem[MAXN];
int vis[MAXN];
int size[MAXN];
int cnt;
int sum;
int root;
vector<int> ans;

void addEdge(int u, int v){
    edge[cnt].u = u;
    edge[cnt].v = v;
    edge[cnt].next = head[u];
    head[u] = cnt++;
    return;
}

void ini(int n)
{
    for(int i = 1; i <= n; i++)
        head[i] = -1;
    cnt = 0;
    return;
}


int dfs(int u)
{
    for(int i = head[u]; ~i; i = edge[i].next)
    {
        int v = edge[i].v;    
        tem[u] += dfs(v);
    }
    if(tem[u] == sum && u != root)
    {
        ans.push_back(u);
        return 0;
    }
    return tem[u];
}
int main()
{
    int n;
    scanf("%d", &n);
    ini(n);

    for(int i = 1; i <= n; i++)
    {
        int v, temp;
        scanf("%d %d", &v, &temp);
        addEdge(v, i);
        tem[i] = temp;
        if(v == 0)
            root = i;
        sum += temp;
    }
    if(sum%3)
    {
        printf("-1\n");
        return 0;
    }
    sum /= 3; 
    dfs(root);
    if(ans.size() == 2)
    {
        sort(ans.begin(), ans.end());
        for(int i = 0; i < ans.size(); i++)
        {
            cout << ans[i] << ' ' ;
        }
    }
    else 
        cout << "-1" << endl;    
    return 0;
 } 

 

posted @ 2021-03-13 10:00  斌斌翻水水  阅读(63)  评论(0)    收藏  举报