Description
Input
Output
Sample Input
3110310 5 31 21 351 2 3 4 53 12 12 42 5
Sample Output
YesNoYes
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#define mem(_, __) memset(_, __, sizeof(_));
const int maxn = 111;
using namespace std;
int a[maxn], T, n, x, y;
bool flag, vis[maxn][maxn], v[maxn];
void DFS(int x, int sum)
{
if (sum == n - 1)
{
return ;
}
for (int i = 1; i <= n; i ++)
{
if (i == x)
continue;
// 已经走过了
if (v[i] == 1)
continue;
// 不存在从x到i的边
if (vis[x][i] == 0)
continue;
// 有一条边不满足条件,即父节点的权值小于等于任意子节点的权值,所以直接终止查找
if (a[x] > a[i])
{
flag = true;
return;
}
v[i] = 1;// 标记当前节点
DFS(i, sum + 1);
if (flag)
return;
}
}
int main()
{
scanf("%d", &T);
while (T --)
{
scanf("%d", &n);
for (int i = 1; i <= n; i ++)
scanf("%d", &a[i]);
mem(vis, 0);
// n - 1 条边
for (int i = 1; i < n; i ++)
{
scanf("%d%d", &x, &y);
vis[x][y] = vis[y][x] = 1;
}
flag = false;
mem(v, 0);
v[1] = 1;
DFS(1, 0);
if (flag)
cout << "No" << endl;
else
cout << "Yes" << endl;
}
return 0;
}