hiho1041 - 树,遍历

题目链接

给一棵树,给一个序列,问能不能按这个序列遍历这棵树,满足每条边最多经过两次。

--------------------------------------------------------------------------

因为数据小,所以直接用二维数组存储边,同时用这个数组记录边的访问次数。

因为是树,任意两个顶点间的路径只有一条,所以问题简单了很多

依次处理给定的序列,从一个顶点dfs到另一个顶点的同时检查该路径上的边是否访问超过两次了,如果超过两次则返回false

#include <set>
#include <map>
#include <stack>
#include <queue>
#include <cmath>
#include <vector>
#include <string>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>

#define MAX(a,b) ((a)>=(b)?(a):(b))
#define MIN(a,b) ((a)<=(b)?(a):(b))
#define OO 0x0fffffff
using namespace std;
typedef long long LL;

const int N = 128;
int maze[N][N];
bool vis[N];
int n,m;
bool dfs(int s,int e){
    vis[s] = true;
    for(int i=1;i<=n;i++){
        if(maze[s][i]&&(!vis[i])){
            if(i==e||dfs(i,e)) {
              if(maze[s][i]>=3) return false;
              maze[s][i]++;
              maze[i][s]++;
              return true;
            }
        }
    }
    return false;
}
int main(){
    int t;
    int a,b,c;
    int epos,spos;
    for(scanf("%d",&t);t--;){
        scanf("%d",&n);
        memset(maze,0,sizeof(maze));
        for(int i=1;i<n;i++){
            scanf("%d%d",&a,&b);
            maze[a][b] = maze[b][a] = 1;
        }
        cin>>m;
        epos = 1;
        bool flag = true;
        while(m--){
            spos = epos;
            scanf("%d",&epos);
            if(flag){
                memset(vis,false,sizeof(vis));
                flag = dfs(spos,epos);
            }
        }
        if(flag) puts("YES");
        else puts("NO");
    }
    return 0;
}
时间: 2024-10-17 00:09:23

hiho1041 - 树,遍历的相关文章

jquery:树遍历

.children() 获得元素集合中每个匹配元素的子元素,选择器选择性筛选. <!DOCTYPE html> <html> <head> <style> body { font-size:16px; font-weight:bolder; } p { margin:5px 0; } </style> <script src="http://code.jquery.com/jquery-latest.js"><

06. 父子节点(树)遍历写法小结

原文:06. 父子节点(树)遍历写法小结 对于树/图的遍历,通常有2种算法来实现:迭代(Iteration)和递归(Recursion),迭代是利用循环反复取值/赋值的过程:递归则是反复自己调用自己来获得最终结果.SQL Server里的递归有32层嵌套限制,目的在于防止代码进入死循环,除非使用提示OPTION (MAXRECURSION 0). 测试数据: if OBJECT_ID('city') is not null drop table city GO create table city

python 树遍历

使用python实现的树遍历,包括宽度优先和深度优先 ef dfs(): tree = { 'A': ['B', 'C'], 'B': ['D', 'E'], 'C': ['F', 'G'], 'D': ['H', 'I'], 'E': [], 'F': [], 'G': [], 'H': [], 'I': [] } leaf = [] to_crawl = deque(['A']) while to_crawl: current = to_crawl.popleft() print curre

python GUI编程tkinter示例之目录树遍历工具

摘录 python核心编程 本节我们将展示一个中级的tkinter应用实例,这个应用是一个目录树遍历工具:它会从当前目录开始,提供一个文件列表,双击列表中任意的其他目录,就会使得工具切换到新目录中,用新目录中的文件列表代替旧文件列表.这里新增了列表框.文本框和滚动条,此外还增加了鼠标单击.键盘按下.滚动操作等回调函数.其实,整个应用就是一系列控件和函数的组合. #python 3.6 import os from time import sleep from tkinter import * #

树遍历以及图遍历的方法

树遍历: 根节点=D=Degree  左节点=L=Left  右节点=R=Right 1.前序遍历(DLR) 2.中序遍历(LDR) 3.后序遍历(LRD) 4.层次遍历(一层一层的遍历) 前三种遍历均可用递归或者非递归的方式来遍历. 层次遍历可以设一个队列,把元素放在队列里,每次输出队头元素. 图遍历: 1.广度优先遍历 也称为广度优先搜索(BFS)(类似于树的层次遍历) 2.深度优先遍历 也称为深度优先搜索(DFS) (类似于树的前序遍历) 这两种遍历均可用来判断图的连通性. 原文地址:ht

树遍历

;前序遍历(DLR) ,结点可以直接输出 每个节点入栈后,直接输出找到叶子节点,回朔 右孩子在这么来一次 ;中序遍历(LDR) 每个结点入栈,往左孩子方向一直找到叶子结点,回朔,输出结点内容,右孩子在来一次 ;后序遍历(LRD) 每 个节点入栈,往左孩子方向一直不找到叶子节点,回朔,判断1左孩子和右孩子都等于空输出,保存输出的结点指针,2右孩子为空或者当前结点的右孩子等于上次 保存的输出结点,那么就输出,保存输出结点,当前结点置空,continue 3 如果结点还有右孩子那么pop之后应该把po

BST树遍历O(n)时间复杂度+O(1)空间复杂度

问题描述 BST树的遍历问题常常遇到,前序.中序.后序等.如果用递归的话,是非常方便的,其时间复杂度是O(n),空间复杂度是O(log n)级别.PS:stackoverflow问答网站上有一个问题指出,这类问题的复杂度不应该直接说是O(log n),因为编译器会进行一些优化,比如修改成尾递归等.不过我们这里暂时不考虑优化,从程序逻辑上来讲,BST递归遍历认为是O(log n)的复杂度. OK,那么如果改进遍历方法,使得空间复杂度只有O(1)呢? 解决方案 解决方法中,是针对每个叶节点,将其右指

树遍历和非递归

利用随机函数产生80个(不大于200且各不相同的)随机整数,用这些整数来生成一棵二树,分别对二叉树进行先序遍历,中序遍历和后序列遍历输出树中结点元素序列.注意:先序遍历输出要求采用非递归来实现. (2)程序实现的基本思想 1.建立合适的二叉树 程序是以 图1.1 的形式建立的. 2.前序遍历是以stack栈和指针左右子女实现的. 3.前序遍历,中序遍历,后序遍历分别用了递归实现. 4.如建立二叉树,其中随机产生的数值是(因为80个数比较多,所以就以#define Max_size 10,若要以8

C# 表达式树遍历(二)

一.前言 上一篇我们对表达式树有了初步的认识,这里我们将对表达式树进行遍历,只有弄清楚了他的运行原理,我们才可以对他进行定制化修改. 表达式系列目录 C# 表达式树讲解(一) C# 表达式树分页扩展(三) 二.表达式树的遍历 要查看表达式树的遍历,肯定不能直接用.Net Framework封装的方法,因为.Net Framework框架是闭源的,除了看中间语言(IL)去查看.我们就用ExpressionVisitor类查看一下他的运行原理,看了下ExpressionVisitor类,里面都是对各