(2015年郑州轻工业学院ACM校赛题) J 堆

判断是否是一个堆,把树构造好遍历一遍就OK了

 

#include<stdio.h>

#include<iostream>

#include<stack>

#include<queue>

#include<math.h>

#include<stdlib.h>

#include<cstring>

#include<algorithm>

using namespace std;

#define Max(a,b) (a>b?a:b)

#define Min(a,b) (a<b?a:b)

#define INF 0xfffffff

#define maxn 410

 

int Tree[maxn][maxn], n, flag, Value[maxn], vis[maxn];

 

void DFS(int k)

{

 

    vis[k] = 1;

    for(int i=1; i<=n; i++)

    {

        if(Tree[k][i] && !vis[i])

        {

            if(Value[k] <= Value[i])

                DFS(i);

            else

                flag = 1;

        }

    }

}

 

int main()

{

    int T, i, a, b;

 

    cin >> T;

 

    while(T--)

    {

        cin >> n;

        flag = 0;

        memset(Tree, 0, sizeof(Tree));

        memset(vis, 0, sizeof(vis));

        for(i=1; i<=n; i++)

            cin >> Value[i];

 

        for(i=1; i<n; i++)

        {

            cin >> a >> b;

            Tree[a][b] = 1;
       Tree[b][a] = 1;//谢谢提醒! } DFS(
1); if(flag) printf("No\n"); else printf("Yes\n"); } return 0; }

 

你可能感兴趣的:(ACM)