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;
}

posted on 2013-11-17 14:27  仗剑奔走天涯  阅读(291)  评论(0编辑  收藏  举报

导航