zoukankan      html  css  js  c++  java
  • 洛谷 P1352 没有上司的舞会

    树形动规入门题

    先放题面

    题目描述

    某大学有N个职员,编号为1~N。他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司。现在有个周年庆宴会,宴会每邀请来一个职员都会增加一定的快乐指数Ri,但是呢,如果某个职员的上司来参加舞会了,那么这个职员就无论如何也不肯来参加舞会了。所以,请你编程计算,邀请哪些职员可以使快乐指数最大,求最大的快乐指数。

    输入输出格式

    输入格式:
    第一行一个整数N。(1<=N<=6000)
    接下来N行,第i+1行表示i号职员的快乐指数Ri。(-128<=Ri<=127)
    接下来N-1行,每行输入一对整数L,K。表示K是L的直接上司。
    最后一行输入0 0

    输出格式:
    输出最大的快乐指数。

    输入输出样例

    输入样例#1:
    7
    1
    1
    1
    1
    1
    1
    1
    1 3
    2 3
    6 4
    7 4
    4 5
    3 5
    0 0

    输出样例#1:
    5

    这是一道非常简单的树形动规入门题,思路也很简单
    摘取题意可知,一个人不愿意与自己的直接上司同时参加舞会,也就是相当于一个人不能与自己直接下属及直接上司同时参加舞会,继续化简就是每个点不会与和自己直接相连的点同时被选中说白了就是

    最大独立集问题

    那么我们直接看代码说话咯

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<cctype>
    #define gc() getchar()
    #define ll long long
    #define maxn 6005
    using namespace std;
    
    inline ll read(){   //快读不多解释
    	ll a=0;char p=gc();int f=0;
    	while(!isdigit(p)){f|=(p=='-');p=gc();}
    	while(isdigit(p)){a=(a<<3)+(a<<1)+(p^48);p=gc();}
    	return f?-a:a;
    }
    
    struct ahaha{   //邻接表存边
    	int to,next;
    }e[maxn*2];
    int n,head[maxn],sz,a[maxn];
    ll f[maxn][2];   //f[i][0]表示第i个点未被选中的最大值,f[i][1]表示第i个点被选中的最大值
    inline void add(int u,int v){  //添加边的操作
    	e[sz].to=v;e[sz].next=head[u];head[u]=sz++;
    }
    void dfs(int u,int fa){    //核心深搜
    	for(int i=head[u];~i;i=e[i].next){   //遍历这个点的所有儿子
    		int v=e[i].to;if(v==fa)continue;   //防止循环回去
    		dfs(v,u);
    		f[u][0]+=max(f[v][1],f[v][0]);
    		f[u][1]+=f[v][0];
    	}
    }
    
    int main(){memset(head,-1,sizeof head);   //head数组置为-1方便判回操作
    	n=read();
    	for(int i=1;i<=n;++i){a[i]=read();f[i][1]=a[i];}  //若一个点被选中,则至少加上它自己的“快乐指数”
    	for(int i=1;i<=n;++i){
    		int x=read(),y=read();
    		add(x,y);add(y,x);
    	}
    	dfs(1,0);  //以1为根节点(这道题并没有交代根节点,所以以1为根节点)
    	printf("%lld",max(f[1][0],f[1][1]));
    	return 0;
    }
    
  • 相关阅读:
    Unable to load the specified metadata resource
    Web开发人员速查卡
    vs 中大括号之间垂直虚线显示
    第4届华为编程大赛决赛试题解答(棋盘覆盖)
    assert()函数用法总结
    Win7安装VC++6.0已知的兼容性问题的解决方法
    VC6打开一个文件或工程的时候,会导致VC6崩溃而关闭
    浮点数取整.
    1.4 VC6.0在win7下安装的兼容性问题以及解决办法
    华为编程大赛_将字符数组内的数字排序
  • 原文地址:https://www.cnblogs.com/hanruyun/p/9135155.html
Copyright © 2011-2022 走看看