hdu5325 Crazy Bobo(建图,搜索)

来源:互联网 发布:java使用redis统计 编辑:程序博客网 时间:2024/05/16 06:45

hdu5325

题目

Bob有一棵树,上面有点,点有权值,求最大的点的集合,他们联通且将点按照权值升序排序后,序列中相邻点的路径上的任意一点都要比起点小。

思路

转换成有向图进行搜索,根据点的权值建图,小的点指向大的点,在图上寻找能经过最多点的点。大的点总是作为某段序列的图上的终点,保证排序后当他们是起点时经过的点肯定比他们小。

代码

#include <iostream>#include <cstdlib>#include <cstdio>#include <vector>using namespace std;int num;int w[500100];vector<int> edges[500100];int rem[500100];int dfs(int root){    if(rem[root]!=0) return rem[root];    rem[root]=1;    for(int i=0; i<edges[root].size(); i++)    {        int to=edges[root][i];        rem[root]+=dfs(to);    }    return rem[root];}int main(){    while(scanf("%d",&num)!=EOF)    {        for(int i=1; i<=num; i++)        {            rem[i]=0;            edges[i].clear();        }        for(int i=1; i<=num; i++)        {            scanf("%d",&w[i]);        }        for(int i=0; i<num-1; i++)        {            int a,b;            scanf("%d %d",&a,&b);            if(w[a]>w[b])                edges[b].push_back(a);            else                edges[a].push_back(b);        }        int ans=0;        for(int i=1; i<=num; i++)            ans=max(ans,dfs(i));        printf("%d\n",ans);    }    return 0;}
0 0
原创粉丝点击