11月19日集训

来源:互联网 发布:android 实时监听网络 编辑:程序博客网 时间:2024/06/05 14:37
       这一周主要还是做树性dp,最大的障碍是看不懂题意,然后样例输出也看不懂,哭。先看的是comtuper这道题,题意是求树中每个点到所有叶子节点的距离的最大值是多少。 由于对于一个节点来说,可能得到的距离最大的值的路径来自他的子树,或者从他的父节点过来,所以要用两次DFS。 第一次DFS求出所有节点在他的子树范围内到叶子节点距离的最大值和第二大的值,第二次DFS更新从父节点过来的情况就可以了。 然后看Balancing Act,题意是找到树的中心,就是删除一个点,让剩下的最大的树最小,第一次用邻接表的方法存树,研究了半天,这个表头结点所对应的顶点存在相邻顶点,则把相邻顶点依次存放于表头结点所指向的单向链表中。无向图存储两次。为了防止两头重复找,要加一维判断是否重复找了。然后删点,使剩下的分支中最大的节点数最小,深搜一次记录到叶子节点距离,再进行枚举求最大值,再更新答案。接下来Godfather和Tree Cutting和Contestants Division都是一个思路,就删着玩就行了。然后TELE,题意是一个树形网络,编号为1的是广播站,叶子节点为广播接收者,要想使用必须付出费用,中间的其他点是中继站,信号到达每个中继站都会有一定的消费;问在保证广播站收益不亏本的情况下使用者最多是多少?dp[i][j]表示第i个点下面有j个使用用户的收益;状态转移方程:dp[u][j]=max(dp[u][j],dp[u][j-k]+dp[v][k]-edge[i].w); 其中u是v的父节点,j枚举u节点的所有子叶点数,k枚举v节点的所有子叶点数,edge[i].w表示u节点下的使用用户不是0的话要减去的成本 dp全部初始化为-inf,dp[i][0]赋为0;然后是Rebuilding Roads ,题意是,给出n,p,一共有n个节点,要求最少减去最少的边是多少,剩下p个节点。用dp[s][i]表示记录s结点,要得到一i个节点的子树去掉的最少边数,状态转移方程是dp[s][i]=min (min(dp[s][j]+dp[k][i-j]),dp[s][i]+1)。最后看了一道The more, The Better,汉语题和以前做的一道士兵进攻城堡的一道题是一个思想,这里就不多说了。
原创粉丝点击