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");
}
}