CF29D - Ant on the Tree(DFS)

题目大意

给定一棵树,要求你按给定的叶子节点顺序对整棵树进行遍历,并且恰好经过2*n-1个点,输出任意一条符合要求的路径

题解

每次从叶子节点开始遍历到上一个叶子节点就OK了, 这个就是符合要求的路径

代码:

#include <iostream>

#include <cstdio>

#include <cstring>

#include <algorithm>

#include <vector>

using namespace std;

#define MAXN 305

vector<int>G[MAXN],ans;

bool dfs(int rt,int u,int fa)

{

     if(rt==u) return true;

     int len=G[u].size();

     for(int i=0;i<len;i++)

     {

         int v=G[u][i];

         if(fa==v) continue;

         if(dfs(rt,v,u))

         {

               ans.push_back(u);

               return true;

         }

     }

     return false;

}

int main()

{

    //freopen("tree.txt","r",stdin);

    int n;

    scanf("%d",&n);

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

    {

        int u,v;

        scanf("%d%d",&u,&v);

        G[u].push_back(v);

        G[v].push_back(u);

    }

    ans.push_back(1);

    int rt=1,v;

    while(scanf("%d",&v)!=EOF)

    {

        dfs(rt,v,-1);

        rt=v;

    }

    dfs(rt,1,-1);

    if(ans.size()!=(2*n-1)) printf("-1\n");

    else

    {

          for(size_t i=0;i<ans.size();i++) printf("%d ",ans[i]);

          printf("\n");

    }

    return 0;

}

你可能感兴趣的:(tree)