HDU 5325 Crazy Bobo(深搜)

题意:给一个n,接着输入n个数,表示n个点的值,接着输入n-1条边形成一个生成树

问最大有多少个点的集合使得该集合内的所有点都满足如下:对于集合内点大小相邻的两个点,该两点之间经过的所有点的大小都小于该两点

eg  7

3 30 350 100 200 300 400

1 2 2 3 3 4 4 5 5 6 6 7

该无向图可表示为1——2——3——4——5——6——7

  取点6对于集合(3-7)来说,正好比他大的点为点3,且他们之间的所有点的

大小都小于该两点,满足条件

  同理取该集合内的其他点也满足条件

所有这个集合所有点满足条件,所以最大值为5(计算其他集合发现没有更大的集合满足上述条件)

分析:该题可以转换为,建有向图,对于一条边点值小的指向大的边,求由一

个点出发可以走过的最多的点数

如样例图为1->2->3<-4->5->6->7 当取点4时能经过5个点

注意:用深搜写要手动扩栈,并且要有C++交,不然会RE暴栈,用bfs写不会

代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#pragma comment(linker,"/STACK:102400000,102400000")  //手动扩栈
using namespace std;
const int maxn = 5e5+5;
int E = 0;
int w[maxn];
int num[maxn];
int pnt[maxn*2],nxt[maxn*2],head[maxn*2];
void add(int u,int v)                   //邻接表
{
    nxt[E]=head[u];
    pnt[E]=v;
    head[u]=E++;
}
void dfs(int u){            //深搜
    num[u]++;
    for(int i=head[u];i!=-1;i=nxt[i]){
        int v=pnt[i];
        if(!num[v]) dfs(v);
        num[u]+=num[v];     //加上邻接点走过的个数
    }
}
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        E=0;
        memset(head,-1,sizeof(head));
        memset(num,0,sizeof(num));
        for(int i=1;i<=n;i++) scanf("%d",&w[i]);
        for(int i=1;i<n;i++){
            int u,v;
            scanf("%d%d",&u,&v);
            if(w[u]<w[v]) add(u,v);
            else add(v,u);
        }
        int ans=0;
        for(int i=1;i<=n;i++){
            if(!num[i]) dfs(i);
            ans=max(ans,num[i]);    //求最大值
        }
        printf("%d\n",ans);
    }
    return 0;
}

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

时间: 2024-10-08 10:41:45

HDU 5325 Crazy Bobo(深搜)的相关文章

hdu 5325 Crazy Bobo dfs

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

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

HDU 5325 Crazy Bobo

对原来的边(u, v)  方向定为u->v当w[u] > w[v] 最大Set是max{u到达的点集合} Crazy Bobo Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others) Total Submission(s): 382    Accepted Submission(s): 116 Problem Description Bobo has a tree,whose ve

HDU 5325 CRAZY BOBO 排序

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

HDU 5325 Crazy Bobo(思路+dfs 记忆化)

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

hdu 1175 连连看 (深搜)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1175 题目大意:如果某两个相同的棋子,可以通过一条线连起来(这条线不能经过其它棋子)这样的两个棋子可以消掉.还有一个要注意的地方的就是转弯.转弯的次数不超过两次,这两个棋子才可以在棋盘上消去~ 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 int

hdu 1518 Square(深搜dfs)

转载请注明出处:http://blog.csdn.net/u012860063?viewmode=contents 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1518 --------------------------------------------------------------------------------------------------------------------------------------------

hdu 1518 Square(深搜+剪枝)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1518 题目大意:根据题目所给的几条边,来判断是否能构成正方形,一个很好的深搜应用,注意剪枝,以防超时! 1 #include <iostream> 2 #include <cstdio> 3 #include<algorithm> 4 #include <cstring> 5 using namespace std; 6 int ap[30],visit[30]

DFS/BFS+思维 HDOJ 5325 Crazy Bobo

题目传送门 1 /* 2 题意:给一个树,节点上有权值,问最多能找出多少个点满足在树上是连通的并且按照权值排序后相邻的点 3 在树上的路径权值都小于这两个点 4 DFS/BFS+思维:按照权值的大小,从小的到大的连有向边,搜索最多连接点数即是答案.因为排序后,他们之间的路径, 5 可定都是从当前节点u连过去的,那么都是小于这两个节点的.DFS需手动加栈,BFS类似拓扑排序的思路 6 */ 7 #pragma comment (linker, "/STACK:1024000000,10240000