解题报告 之 HDU5325 Crazy Bobo

解题报告 之 HDU5325 Crazy Bobo

Description

Bobo has a tree,whose vertices are conveniently labeled by 1,2,...,n.Each node has a weight .
All the weights are distrinct.

A set with m nodes  is
a Bobo Set if:

- The subgraph of his tree induced by this set is connected.

- After we sort these nodes in set by their weights in ascending order,we get ,(that
is, for
i from 1 to m-1).For any node  in
the path from  to (excluding  and ),should
satisfy .

Your task is to find the maximum size of Bobo Set in a given tree.

Input

The input consists of several tests. For each tests:

The first line contains a integer n ().
Then following a line contains n integers  (,all
the  is
distrinct).Each of the following n-1 lines contain 2 integers  and ,denoting
an edge between vertices  and  ().

The sum of n is not bigger than 800000.

Output

For each test output one line contains a integer,denoting the maximum size of Bobo Set.

Sample Input

7
3 30 350 100 200 300 400
1 2
2 3
3 4
4 5
5 6
6 7 

Sample Output

5 

题目大意:给一个连通图,有n个节点,n-1条无向边并给出每个点的权值。让你找一个最大的子图满足子图中的连接权重相邻的两点 u,v 的道路中任意节点x的权值都比u、v的小。(其实好像看题的时候没看出来是这个意思,查了下才知道)。

分析:因为这个子图任意权重相邻的点都要满足这个条件,所以这个子图一定连通(否则一定存在权值相邻的点之间没有连通path)。然后注意到这个条件,这个子图任意权重相邻点之间的路要么是没有点,要么一定是呈现山谷状的,即两边最高,向中间递减。那么从图中的一个点开始,以它为最低点,向两边较高的扩展,然后再以同样的方式去搜索这两个较高点。那么任意两个权值相邻的点,往回找通路的时候一定都是呈现山谷状的。那么问题就转换成了,从某个点出发,去找到它能够扩展到的最大点数,深搜一次即可。

上代码:

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;
const int MAXN = 5e6+10;

struct Edge
{
	int to, nxt;
};

Edge edge[MAXN];
int head[MAXN];
int w[MAXN];
int num[MAXN];
int cnt, ans;

void addedge( int from, int to )
{
	edge[cnt].to = to;
	edge[cnt].nxt = head[from];
	head[from] = cnt++;
}

int dfs( int u )
{
	if(num[u]) return num[u];
	num[u] = 1;

	for(int i = head[u]; i != -1; i = edge[i].nxt)
	{
		int v = edge[i].to;
		num[u]+=dfs( v );
	}
	return num[u];
}

int main()
{
	int n;
	while(scanf( "%d", &n ) == 1)
	{
		cnt = 0;
		memset( num, 0, sizeof num );
		memset( head, -1, sizeof head );
		for(int i = 1; i <= n; i++)
			scanf( "%d", &w[i] );
		for(int i = 0; i < n - 1; i++)
		{
			int u, v;
			scanf( "%d%d", &u, &v );
			if(w[u] < w[v])
				addedge( u, v );
			else
				addedge( v, u );
		}
		ans = 0;

		for(int i = 1; i <= n; i++)
			ans = max( ans, dfs( i ) );

		cout << ans << endl;

	}
	return 0;
}

嗯就是这样!

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-10 06:44:12

解题报告 之 HDU5325 Crazy Bobo的相关文章

hdu 5325 Crazy Bobo 乱搞+搜索

Crazy Bobo Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)Total Submission(s): 218    Accepted Submission(s): 60 Problem Description Bobo has a tree,whose vertices are conveniently labeled by 1,2,...,n.Each node h

解题报告 之 ZOJ2332 Gems

解题报告 之 ZOJ2332 Gems Description Wealthy alsomagic! Supernatural alsomagic! But also poor alsomagic! Because he is now puzzled by a problem, and will go crazy if you can't help him. alsomagic has a lot of gems with different colors and shapes. His sup

hdu 5325 Crazy Bobo dfs

// hdu 5325 Crazy Bobo // // 题目大意: // // 给你一棵树,树上每一个节点都有一个权值w,选择尽可能多的节点, // 这些节点相互联通,而且依照权值升序排序之后得到节点编号, // 需相邻节点之间的随意节点都要大于较小的节点. // // 解题思路: // 对于每一对u,v,我们建一条这种边:权值小的像权值大的连一条边. // 这样,问题就转化为求以u最小的权值为根的子树上点集的最大值. // dfs就可以. // // // 感悟: // // 多校的一道题目

HDOJ 5325 Crazy Bobo 树形DP

按照升序或者降序选择的点集可以满足条件..... 树上的每个节点可以从子节点转移,也可以从父亲节点转移 Crazy Bobo Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others) Total Submission(s): 325    Accepted Submission(s): 100 Problem Description Bobo has a tree,whose vert

解题报告 之 POJ3057 Evacuation

解题报告 之 POJ3057 Evacuation Description Fires can be disastrous, especially when a fire breaks out in a room that is completely filled with people. Rooms usually have a couple of exits and emergency exits, but with everyone rushing out at the same time

hdu 1541 Stars 解题报告

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1541 题目意思:有 N 颗星星,每颗星星都有各自的等级.给出每颗星星的坐标(x, y),它的等级由所有比它低层(或者同层)的或者在它左手边的星星数决定.计算出每个等级(0 ~ n-1)的星星各有多少颗. 我只能说,题目换了一下就不会变通了,泪~~~~ 星星的分布是不是很像树状数组呢~~~没错,就是树状数组题来滴! 按照题目输入,当前星星与后面的星星没有关系.所以只要把 x 之前的横坐标加起来就可以了

【百度之星2014~初赛(第二轮)解题报告】Chess

声明 笔者最近意外的发现 笔者的个人网站http://tiankonguse.com/ 的很多文章被其它网站转载,但是转载时未声明文章来源或参考自 http://tiankonguse.com/ 网站,因此,笔者添加此条声明. 郑重声明:这篇记录<[百度之星2014~初赛(第二轮)解题报告]Chess>转载自 http://tiankonguse.com/ 的这条记录:http://tiankonguse.com/record/record.php?id=667 前言 最近要毕业了,有半年没做

2016 第七届蓝桥杯 c/c++ B组省赛真题及解题报告

2016 第七届蓝桥杯 c/c++ B组省赛真题及解题报告 勘误1:第6题第4个 if最后一个条件粗心写错了,答案应为1580. 条件应为abs(a[3]-a[7])!=1,宝宝心理苦啊.!感谢zzh童鞋的提醒. 勘误2:第7题在推断连通的时候条件写错了,后两个if条件中是应该是<=12 落了一个等于号.正确答案应为116. 1.煤球数目 有一堆煤球.堆成三角棱锥形.详细: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形), 第四层10个(排列成三角形). -. 假设一共

[noip2011]铺地毯(carpet)解题报告

最近在写noip2011的题,备战noip,先给自己加个油! 下面是noip2011的试题和自己的解题报告,希望对大家有帮助,题目1如下 1.铺地毯(carpet.cpp/c/pas) [问题描述]为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯.一共有n 张地毯,编号从1 到n.现在将这些地毯按照编号从小到大的顺序平行于坐标轴先后铺设,后铺的地毯覆盖在前面已经铺好的地毯之上.地毯铺设完成后,组织者想知道覆盖地面某个点的最上面的那张地毯的