zoukankan      html  css  js  c++  java
  • [jobdu]树的子结构

    判断一棵树B是否是A的子树,对A做DFS,然后不断判断是否和B相同。

    其实也可以不对A做DFS,直接遍历A中的每个节点和B做树的比较就行了。

    #include <iostream>
    #include <vector>
    using namespace std;
      
    bool sameTree(int a, int b, vector<vector<int> > &treeA, vector<vector<int> > &treeB, vector<int> &valA, vector<int> &valB) {
        if (valA[a] != valB[b]) return false;
        if (treeB[b].size() == 0) return true;
        if (treeA[a].size() != treeB[b].size()) return false;
        for (int i = 0; i < treeA[a].size(); i++) {
            if (!sameTree(treeA[a][i], treeB[b][i], treeA, treeB, valA, valB))
                return false;
        }
        return true;
    }
      
    bool subTree(vector<vector<int> > &treeA, vector<vector<int> > &treeB, vector<int> &valA, vector<int> &valB, int root) {
        if (sameTree(root, 1, treeA, treeB, valA, valB)) {
            return true;
        }
        for (int i = 0; i < treeA[root].size(); i++) {
            if (subTree(treeA, treeB, valA, valB, treeA[root][i])) {
                return true;
            }
        }
        return false;
    }
      
    int main() {
        int n, m;
        while (cin >> n >> m)
        {
            vector<vector<int> > treeA(n+1);
            vector<vector<int> > treeB(m+1);
            vector<int> valA(n+1);
            vector<int> valB(m+1);
            for (int i = 1; i <= n; i++) {
                int tmp;
                cin >> tmp;
                valA[i] = tmp;
            }
            for (int i = 1; i <= n; i++) {
                int cnt;
                cin >> cnt;
                while (cnt--) {
                    int x;
                    cin >> x;
                    treeA[i].push_back(x);
                }
            }
            for (int i = 1; i <= m; i++) {
                int tmp;
                cin >> tmp;
                valB[i] = tmp;
            }
            for (int i = 1; i <= m; i++) {
                int cnt;
                cin >> cnt;
                while (cnt--) {
                    int x;
                    cin >> x;
                    treeB[i].push_back(x);
                }
            }
      
            if (m == 0 || n == 0) {
                cout << "NO" << endl;
                continue;
            }
            if (subTree(treeA, treeB, valA, valB, 1)) {
                cout << "YES" << endl;
            }
            else {
                cout << "NO" << endl;
            }
        }
    }
    

      

  • 相关阅读:
    索引总结篇
    数据库的安全管理
    数据库备份对日志文件的影响
    数据文件与日志文件读取机制
    更新操作所带来的影响
    页拆分-产生碎片
    你不可不知的T-SQL执行顺序
    实用T-SQL收集
    Left Join的神奇效果
    我对数据库索引的理解
  • 原文地址:https://www.cnblogs.com/lautsie/p/3422303.html
Copyright © 2011-2022 走看看