SGU 143.Long Live the Queen(女王万岁)

先确定一个根节点,然后dp[u]表示一定取u的联通块的最大点权和

dp[u]=1+∑dp[v](v是u的孩子并且dp[v]大于0)

代码:

#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
const int maxn=210000;
int head[maxn]={},next[maxn]={},to[maxn]={},w[maxn]={};
int dp[maxn]={};
int n,cnt,ans;
inline void add(int u,int v){
    to[++cnt]=v;
    next[cnt]=head[u];
    head[u]=cnt;
}
void dfs(int u,int fa){
    dp[u]=w[u];
    for(int i=head[u];i!=-1;i=next[i])if(to[i]!=fa){
        int v=to[i];
        dfs(v,u);
        if(dp[v]>0) dp[u]+=dp[v];
    }
    ans=max(ans,dp[u]);
}
int main()
{
    while(scanf("%d",&n)==1){
        memset(head,-1,sizeof(head));
        memset(dp,0,sizeof(dp));
        for(int i=1;i<=n;i++) scanf("%d",&w[i]);
        cnt=0;ans=0;
        for(int i=1;i


你可能感兴趣的:(re0,dp)