zzulioj2525: 咕咕的搜索序列【搜索】

 咕咕已经学到树上的深度优先搜索 (dfs) 啦!由于同一棵树不同的 dfs 访问结点的次序不一样,咕咕干脆定义 了一个搜索序列:一开始序列为空,而每次离开这个点,并且不会再返回这个点时,就把这个点加入序列中, 最后返回到根节点后也把根节点加入这个序列中,这样就定义了一个与 dfs 一一对应的搜索序列!而且这个 搜索序列,也是所有点的一个排列。  
    对于一棵有根树(结点标号 1 到 n,以 1 为根),咕咕对它跑了一遍 dfs 得到了搜索序列后,它准备把这个序 列抄在纸上拿给咸鱼看。但是,粗心的咕咕在抄这个序列的时候,一些点被它忽略了,纸上的序列只有 m 个 点。待咸鱼看到纸上这个序列后,咸鱼就很好奇:咕咕那么粗心,只是抄少了点这么简单吗,会不会同时把 一些点的位置也给变化了呢? 
     现在,聪明的你,你能判断出来咕咕在抄的时候有没有把点的位置变化了吗?也就是说,咕咕给的 m 个点的 序列,真的能够由一个 dfs 得到的搜索序列删除几个点后得到吗?  

输入

第一行一个整数 T(1≤ T ≤106),表示有 T 组数据。  
对于每组数据: 
 第一行有两个正整数 n 和 m(1≤m≤n≤106),表示树的点数和咕咕给的序列的点数。 
 第二行有 n−1 个正整数 a1,a2,··· ,an−1(1≤ ai ≤i),表示点 ai 是点 (i+1) 的父结点。  
第三行有 m 个互不相同的正整数,b1,b2,··· ,bm(1≤bi ≤n),表示咕咕给的序列。  
输入保证同一个测试点下的所有数据的 n 的和不超过 106。  

输出

对每一组数据,输出一行。如果一定不能得到,输出 BAD GUGU ;否则输出 NOT BAD 。

 思路:首先对每个点处理一下,然后找到搜索序列,判断是否是它的一部分。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int inf = 0x3f3f3f3f;
const int maxn = 1e6 + 10;
int n, m, cnt;
bool vis[maxn];
vector<int> e[maxn];
int a[maxn], b[maxn], pre[maxn], ans[maxn];
 
void init()
{
    cnt = 0;
    for(int i = 1; i <= n; ++i)
    {
        e[i].clear();
        pre[i] = -1;
        vis[i] = false;
    }
}
void mark(int x)
{
    while(true)
    {
        if(pre[x] == -1 || vis[x])
            break;
        vis[x] = true;
        int u = pre[x];
        e[u].push_back(x);
        x = pre[x];
    }
}
void dfs(int u)
{
    for(int i = 0; i < e[u].size(); ++i)
        dfs(e[u][i]);
    ans[++cnt] = u;
}
 
int main()
{
    int t;
    scanf("%d", &t);
    while(t--)
    {
        init();
        scanf("%d%d", &n, &m);
        for(int i = 1; i < n; ++i)
        {
            scanf("%d", &a[i]);
            pre[i + 1] = a[i];
        }
        for(int i = 1; i <= m; ++i)
            scanf("%d", &b[i]);
        for(int i = 1; i <= m; ++i)
            mark(b[i]);
        dfs(1);
        int pos = 1;
        for(int i = 1; i <= cnt && pos <= m; ++i)
            if(ans[i] == b[pos])
                ++pos;
        if(pos > m)
            printf("NOT BAD\n");
        else
            printf("BAD GUGU\n");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41785863/article/details/89440630
今日推荐