zoukankan      html  css  js  c++  java
  • 树的遍历(天梯赛+51nod)

    给出一棵n个节点的树,节点编号为1-n(根节点编号为1)。对于每一个叶子节点,输出从根到叶子的路径。(按照路径的字典序)。

     

    输入

    第一行:1个数n(2 < n <= 1000),表示树的节点数量。
    后面n-1行:每行2个数x y,表示节点x是节点y的父节点(1 <= x, y <= n)。

    输出

    输出行数等于叶子节点的数量,每行对应从根到叶子节点的路径。路径中的数字为经过节点的编号。按照路径的字典序从小到大输出。

    数据范围

    对于30%的数据,2 < n <= 10;
    对于100%的数据,2 < n <= 1000,1 <= x, y <= n;

    输入样例

    5
    1 2
    1 3
    2 4
    4 5

    输出样例

    1 2 4 5
    1 3

    样例解释

    3 和 5 为叶子结点,对应的路径分别为1 3和1 2 4 5,后者的字典序更小,因此输出结果为:

    1 2 4 5
    1 3

    这个题如果让你输出按照字典序的话,你可以在v[i]中排个序,如果是有根树的话还是按照有根树的遍历比较简单

    #include<iostream>
    #include<algorithm>
    #include<vector>
    using namespace std;
    const int maxn=1e6+100;
    vector<int>v[maxn];
    int ans[maxn];
    int k=1;
    void dfs(int u){
        if(v[u].size()==0){
            for(int i=1;i<=k;i++){
                cout<<ans[i]<<" ";
            }
            cout<<endl;
            return ;
        }
        for(int i=0;i<v[u].size();i++){
            ans[++k]=v[u][i];
            dfs(v[u][i]);
            k--;
        }
    }
    int main(){
        int n;
        cin>>n;
        int x,y;
        for(int i=1;i<=n-1;i++){
            cin>>x>>y;
            v[x].push_back(y);
        }
        for(int i=1;i<=n;i++){
            sort(v[i].begin(),v[i].end());
        }
        ans[1]=1;
        dfs(1);
        return 0;
    }

    病毒溯源

    病毒容易发生变异。

    某种病毒可以通过突变产生若干变异的毒株,而这些变异的病毒又可能被诱发突变产生第二代变异,如此继续不断变化。

    现给定一些病毒之间的变异关系,要求你找出其中最长的一条变异链。

    在此假设给出的变异都是由突变引起的,不考虑复杂的基因重组变异问题 —— 即每一种病毒都是由唯一的一种病毒突变而来,并且不存在循环变异的情况。

    输入格式

    输入在第一行中给出一个正整数 NN,即病毒种类的总数。于是我们将所有病毒从 00 到 N1N−1 进行编号。

    随后 NN 行,每行按以下格式描述一种病毒的变异情况:

    k 变异株1 …… 变异株k

    其中 k 是该病毒产生的变异毒株的种类数,后面跟着每种变异株的编号。第 ii 行对应编号为 ii 的病毒(0i<N0≤i<N)。题目保证病毒源头有且仅有一个。

    输出格式

    首先输出从源头开始最长变异链的长度。

    在第二行中输出从源头开始最长的一条变异链,编号间以 11 个空格分隔,行首尾不得有多余空格。如果最长链不唯一,则输出最小序列。

    注:我们称序列 {a1,,an}{a1,…,an} 比序列 {b1,,bn}{b1,…,bn} “小”,如果存在 1kn1≤k≤n 满足 ai=biai=bi 对所有 i<ki<k 成立,且 ak<bkak<bk。

    数据范围

    1N1e4

    输入样例:

    10
    3 6 4 8
    0
    0
    0
    2 5 9
    0
    1 7
    1 2
    0
    2 3 1
    

    输出样例:

    4
    0 4 9 1
     这个题是天梯赛的题,
    #include<iostream>
    #include<vector>
    #include<algorithm>
    using namespace std;
    const int maxn=5e5+100;
    vector<int>v[maxn];
    int n;
    int a[maxn];
    int t[maxn]; 
    int ans[maxn];
    int ma;
    int cnt=0;
    void dfs(int u,int d){
        for(int i=0;i<v[u].size();i++){
            ma=max(ma,d+1);
            dfs(v[u][i],d+1);    
        }
    }
    int flag=1;
    void dfs1(int u,int d){
        ans[d]=u;
        if(d==ma&&flag){
            flag=0;
            cout<<ma<<endl;
            for(int i=1;i<=ma;i++){
                cout<<ans[i]<<" ";
            }
            cout<<endl;
            return ;
        }
        for(int i=0;i<v[u].size();i++){
            dfs1(v[u][i],d+1);
        }
    }
    int main(){
        cin>>n;
        for(int i=0;i<n;i++){
            int k;
            cin>>k;
            while(k--){
                int x;
                cin>>x;
                v[i].push_back(x);
                t[x]=1;
            }
            if(v[i].size()){
                sort(v[i].begin(),v[i].end());
            } 
        } 
        int root;
        for(int i=0;i<n;i++){
            if(!t[i]){
                root=i;
                break;
            }
        } 
        dfs(root,1);
        dfs1(root,1);
        
    }
  • 相关阅读:
    A1066 Root of AVL Tree (25 分)
    A1099 Build A Binary Search Tree (30 分)
    A1043 Is It a Binary Search Tree (25 分) ——PA, 24/25, 先记录思路
    A1079; A1090; A1004:一般树遍历
    A1053 Path of Equal Weight (30 分)
    A1086 Tree Traversals Again (25 分)
    A1020 Tree Traversals (25 分)
    A1091 Acute Stroke (30 分)
    A1103 Integer Factorization (30 分)
    A1032 Sharing (25 分)
  • 原文地址:https://www.cnblogs.com/lipu123/p/14726570.html
Copyright © 2011-2022 走看看