CSU 2124智慧树(建图+BFS)

CSU 2124智慧树(建图+BFS)

Description

图书馆门前的那两棵树象征着爱与智慧,吸引着很多毕业学子和情侣前来拍照。

某天Wells一个人在智慧树下无聊的数树叶,却惊奇的发现其实智慧树其实也有很重的浪漫气息

Wells发现树上的每个结点都有自己相应的浪漫值,现在她想知道每一层的最大结点浪漫值是多少?

Input

多组数据

第一行一个正整数n,表述n个结点

接着n个正整数,a1,a2,a3,…,a_n表示n个结点的浪漫值

后面一行n-1个正整数,(第i个数字v表示,结点i+1的父亲是v,保证v

Output

根结点为第一层,从根结点开始输出每一层的最大值,用空格隔开,末尾换行。

Sample Input

6

10 6 8 7 3 2

1 2 1 4 4

Sample Output

10 7 8

题意

  给出n个节点以及他们的权值,然后再告诉n个节点之间的关系,求树的每一层的最大值。

解题思路

  由于数据范围是1e5,可以建图,然后直接用BFS(爆发式)算法遍历,最大值用一个数组存即可。至于建图,我用前向星处理了一下。

代码

#include<iostream>
#include<string.h>
#include<stdio.h>
#include<map>
#include<queue>
using namespace std;
const int maxn = 1e5+5;

int arr[maxn],maxx[maxn];
struct node
{
    int x,step;
    node() {}
    node(int a,int b):x(a),step(b) {}
};
struct edge
{
    int to,next;
} edges[maxn*2];
int head[maxn],cnt,n;
int vis[maxn];

void init()
{
    cnt=1;
    memset(head,-1,sizeof(head));
}
void addedges(int u,int v)
{
    edges[cnt].to=v;
    edges[cnt].next=head[u];
    head[u]=cnt++;
}
void bfs()
{
    memset(vis,0,sizeof(vis));
    queue<node> q;
    q.push(node(1,1));
    vis[1]=1;
    maxx[1]=arr[1];
    while(!q.empty())
    {
        node x=q.front();
        q.pop();
        for(int i=head[x.x]; ~i; i=edges[i].next)
        {
            if(vis[edges[i].to]) continue;
            vis[edges[i].to]=1;
            maxx[x.step+1]=max(arr[edges[i].to],maxx[x.step+1]);
            q.push(node(edges[i].to,x.step+1));
        }
    }
}
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        for(int i=1; i<=n; i++)
            scanf("%d",&arr[i]);
        int x;
        init();
        for(int i=1;i<n;i++)
        {
            scanf("%d",&x);
            addedges(x,i+1);
        }
        memset(maxx,-1,sizeof(maxx));
        bfs();
        for(int i=1;maxx[i]!=-1;i++)
            printf("%s%d",i==1?"":" ",maxx[i]);
        printf("\n");
    }
}

猜你喜欢

转载自blog.csdn.net/qq_36258516/article/details/80500799