您的位置:首页 > Web前端 > Node.js

HGC 1356 Prime Node【树形DP+线性素数打表】

2012-04-13 00:06 381 查看
Description

Suppose there is a tree named A. All nodes of A have a weight v(0<v<4000000).Now, we will give the definition of "Prime Node".A node is a Prime Node if the following conditions are satisfied.The subtree of A whose root node is b will be marked as B. If all nodes in B have prime weights and b's weight is greater than other nodes', then b is a Prime Node.Now you are to calculate how many Prime Nodes are in A.

Input

For each test case:The fist line will contains an integer n(1<=n<=10000) indicating the number of nodes in A,the root of A will always be node 1.The second line has n integers giving the weights of each node numbered from 1 to n.The following n-1 lines, each contains a pair of integers x and y indicating there is an edge between x and y, give the n-1 edges of A.

Process to the end of file.

Output

For each test case, first print a line saying "Scenario #k", where k is the number of the test case.Then, print the number of Prime Nodes on a single line.Print a blank line after each test case, even after the last one.

Sample Input

5
12 11 5 7 3
1 2
2 3
2 5
3 4

Sample Output

Scenario #1
3

code :

View Code

#include<stdio.h>
#include<string.h>
int su,tot;
bool pp[4000001];
bool v[10002];
int prime[400000];
int head[10002];
void print()
{
memset(pp,true,sizeof(pp));
int i,j,k;
k=0;
prime[k++]=2;
for(i=3;i<=4000000;i++)
{
if(pp[i])
prime[k++]=i;
for(j=0;j<k&&prime[j]*i<=4000000;j++)
{
pp[prime[j]*i]=false;
if(i%prime[j]==0)
break;
}
}
}
struct node
{
int ls,rs,wi,max,p;
}tree[10001];
struct node1
{
int next,to;
}q[20000];
void add(int s,int u)
{
q[tot].to=u;
q[tot].next=head[s];
head[s]=tot++;
}
void dfs(int r)
{
int son;
tree[r].max=tree[r].wi;
if(!tree[r].ls)
{
if(pp[tree[r].wi])
{
tree[r].p=1;
su++;
}
else tree[r].p=0;
return;
}
son=tree[r].ls;
int flag=1;
if(pp[tree[r].wi])
tree[r].p=1;
else {
tree[r].p=0;
flag=0;
}
while(son)
{
dfs(son);
if(tree[r].p)
{
if(!tree[son].p)
{
tree[r].p=0;
flag=0;
}
if(tree[son].max>=tree[r].max)
{
flag=0;
tree[r].max=tree[son].max;
}
}
son=tree[son].rs;
}
if(flag)su++;
}
int que[10002];
int main()
{
print();
pp[1]=pp[4]=0;
int i,n,k,l,ca=1;
while(scanf("%d",&n)!=EOF)
{
tot=1;  su=0;
memset(head,0,sizeof(head));
memset(tree,0,sizeof(tree));
for(i=1;i<=n;i++)
scanf("%d",&tree[i].wi);
for(i=1;i<n;i++)
{
scanf("%d%d",&k,&l);
add(k,l);
add(l,k);
}
int front=0,rear=0;
memset(v,false,sizeof(v));
que[rear++]=1;
v[1]=1;
while(front<rear)
{
k=que[front++];
for(i=head[k];i;i=q[i].next)
{
l=q[i].to;
if(v[l])continue;
v[l]=true;
tree[l].rs=tree[k].ls;
tree[k].ls=l;
que[rear++]=l;
}

}
dfs(1);
printf("Scenario #%d\n",ca++);
printf("%d\n\n",su);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: