森林变树

#include <bits/stdc++.h>
using namespace std;
const int maxn=310;
int n,dp[maxn][maxn]={0},G[maxn][maxn],m,w[maxn],select[maxn][maxn]={0},b[maxn]={0},c[maxn]={0};//b兄弟,c孩子
//将森林多叉树转换成二叉树
int main() {
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        int x;
        cin>>x>>w[i];
        //要求输入按照根往下的顺序输入边,比如1->2 1->3 不会一会正一会负 1->2 3->1;这里输入的是依赖边
        //因为某个点的孩子存那个都行,这样通过c,获得第一个孩子,然后兄弟迭代(右孩子到底)获得所有兄弟
        //第i个点的左子树是孩子,右子树是兄弟,所以b[maxn],c[maxn],就是对应的左右子树数组
        b[i]=c[x];
        c[x]=i;
    }
//    dfs(0,-1);
    cout<<dp[0][m]<<endl;
    return 0;
}
原文地址:https://www.cnblogs.com/MorrowWind/p/13056525.html