POJ 1635 Subway tree systems

2023-05-16

题目:Some major cities have subway systems in the form of a tree, i.e. between any pair of stations, there is one and only one way of going by subway. Moreover, most of these cities have a unique central station. Imagine you are a tourist in one of these cities and you want to explore all of the subway system. You start at the central station and pick a subway line at random and jump aboard the subway car. Every time you arrive at a station, you pick one of the subway lines you have not yet travelled on. If there is none left to explore at your current station, you take the subway line back on which you first came to the station, until you eventually have travelled along all of the lines twice,once for each direction. At that point you are back at the central station. Afterwards, all you remember of the order of your exploration is whether you went further away from the central station or back towards it at any given time, i.e. you could encode your tour as a binary string, where 0 encodes taking a subway line getting you one station further away from the central station, and 1 encodes getting you one station closer to the central station. 


题目大意:在一个无环多叉树之中,从根节点出发用深度优先遍历去遍历每个元素,远离根节点用0表示;靠近根节点用1表示。现在有两个字符串,看其能否是同一颗多叉树的深度优先遍历。


思路:一棵树相同当且仅当其子树全相同;判断起来有点复杂。则弱化一下,当且仅当这两棵树的所有子树的元素个数相等,而且个数相等的子树在原树中的深度相等。例如下图:(弱化的当且仅当不知道正确与否!!没检查过是完备


节点除根节点子树元素个数(及根深度)
15(1)
22(2)
30(2)
40(2)
50(3)
60(3)


//284K  32MS
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>

using namespace std;

struct obj{
	short int len;
	short int depth;
	obj():len(0),depth(0){};
};
bool judge(string s1,string s2);//判断s1、s2是否为同一棵树的深度优先遍历
void transfor(string samp, vector<obj>& ret);//把str变成上面讲的所有子树原数个数和深度的结构数组
bool test_equ(vector<obj>& obj1,vector<obj>& obj2);//判断两个排序后的数组是否为完全相同
bool cmp(const obj &a ,const obj &b)//重载比较函数,因为要对结构体排序
{
	if(a.len < b.len)
		return true;
	if(a.len==b.len && a.depth<b.depth)
		return true;
	return false;
}
int main()
{
	const string result[2]={"different","same"};
	int num;
	string s1,s2;
	vector<obj> s12int,s22int;
	cin>>num;
	while(num--){
		s1.clear();s2.clear();
		s12int.clear();s22int.clear();
		cin>>s1>>s2;
		cout<<result[judge(s1,s2)]<<endl;
	}
//	system("pause");
	return 1;
}

bool judge(string s1,string s2){
	if(s1.size() != s2.size())
		return false;
	vector<obj> s12int,s22int;
	s12int = vector<obj>(s1.size()); transfor(s1,s12int);
	s22int = vector<obj>(s2.size()); transfor(s2,s22int);
	sort(s12int.begin(),s12int.end(),cmp);
	sort(s22int.begin(),s22int.end(),cmp);
	return test_equ(s12int,s22int);
}

void transfor(string samp, vector<obj>& ret){
	int len = samp.size(),sum,dep=0;
	if(len != ret.size())
		return;
	for(int i=0;i<len;i++){
		if(samp[i] == '1'){
			dep--;
			ret[i].depth = dep;
		}else{
			dep++;
			ret[i].depth = dep;
		}
	}
	for(int i=0;i<len;i++){
		if(samp[i]=='1'){
			ret[i].len = 0;
			continue;
		}
		sum=0;
		for(int j=i;j<len;j++){
			if(samp[j]=='1'){
				sum++;
			}else{
				sum--;
			}
			if(sum==0){
				ret[i].len = j-i+1;//可以优化,前面判断一些ret[]之后可以知道某些ret[]可以不计算
				break;
			}
		}//for(j)
	}//for(i)
}//end of fun

bool obj_equ(obj t1,obj t2){
	if((t1.depth == t2.depth) && (t1.len == t2.len))
		return true;
	return false;
}

bool test_equ(vector<obj>& obj1,vector<obj>& obj2){
	int len = obj1.size();
	for(int i=0;i<len;i++){
		if(obj_equ(obj1[i],obj2[i]) == false)
			return false;
	}
	return true;
}




遇到网上搜那个有些代码只判断子树元素个数,,没判断树深。会遇到下面的例子判断错误结果!!!但是依然能AC?!但是也不知道我的代码有没有BUG。。。
0010010111000111
0010001111001011



自己想了一下还是有问题,在处理这个示例的时候:

0010001011110000011111
0010000111110000101111


又在网上找了一下:发现有人用树的最小表示方法做。不是动态规划。就是递归将树的子树排序,然后整棵树就变成了一个有序树,然后再比较字符串就可以了。代码如下:(转至http://blog.csdn.net/u012433233/article/details/24424789)


#include <iostream>  
#include <vector>  
#include <string> 
#include <algorithm>
using namespace std;   
  
string min_pre(string str){
      vector<string> box;
      string ret = "";
      int equal = 0, st = 0;
      for(int i = 0; i < str.size(); i++){
           if(str[i] == '0') 
			   equal++;
           else 
			   equal--;
           if(equal == 0){
                if(i - 1 > st + 1){
                    box.push_back("0" + min_pre(str.substr(st + 1,i - 1 - st)) + "1");
                }else 
					box.push_back("01");
                st = i + 1;
           }
      }
      sort(box.begin(), box.end());
      for(int i = 0; i < box.size(); i++) 
		  ret += box[i];
      return ret;
} 
int main() {  
  int t;  
  cin >> t;  
  while (t--) {  
    string tree1, tree2;  
    cin >> tree1 >> tree2; 
    if (min_pre(tree1) == min_pre(tree2))  
      cout << "same" << endl;  
    else  
      cout << "different" << endl;  
  }  
  return 0;  
}



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

POJ 1635 Subway tree systems 的相关文章

  • 没有重复子项的树

    Using anytree https pypi python org pypi anytree我制作了这样的树 A B C D F B C E G 有没有办法删除所有重复的子级并将其变成下面的树 对所有可能级别的子级进行递归 A B C
  • 基于级别的嵌套数组

    0 content Heading 1 2 3 4 5 level 2 anchor heading 1 2 3 4 5 className testtest fontWeight 1 content Heading 2 level 2 a
  • C# 解析宽松的 json 来制作一棵树

    所以我需要解析类似这样的文件 pl GENERIC BACK COFNIJ WAIT CZEKAJ PAGES ABOUTME ID ID INFO STATUS STATUS TOP MENU LOGGED Zalogowany OPTI
  • rpart - 查找修剪树的 cp 值将返回的叶子数量

    我有一个要求 需要根据分类变量 具有超过 5 个类别值 与连续变量的关联将其分为 5 组 为了实现这一目标 我正在使用rpart with annova 方法 例如我的分类变量是type有代码1 2 3 4 5 6 7 8 9 10 11
  • 使用 tree-model-js 将树转换回 JSON

    是否有一种方法可以将 TreeModel 转换为 JSON 字符串 这样它就可以被存储 然后使用tree parse 目前在尝试时JSON stringify root 它给出了关于循环引用的明显错误 因为子级包含父级 父级包含子级 Use
  • 最大函数c树高度

    c 中是否有 max 函数 所以我可以做这样的事情来计算树高 或者也许有更好的方法来计算树高 int height struct node tree if tree NULL return 0 return 1 max height tre
  • 以 BFS 风格将深度的嵌套字典(森林)写入文本文件

    继续我的旧问题 将深度巨大的嵌套字典 森林 写入文本文件 https stackoverflow com questions 51500003 writing nested dictionary forest of a huge depth
  • 获取图表中走过的最长路线

    我有一组相互连接的节点 我有以下节点网络 这里0是起点 我想遍历尽可能多的节点 并且一个节点只遍历一次 另外 在从 0 到目标节点的旅程中 我只想有一个奇数编号的节点 如 1 3 5 7 现在我需要找出从起始位置 0 开始可以行驶的最长路线
  • 使用树输出预测 Spark 中梯度提升树情况下的类概率

    众所周知 Spark 中的 GBT 目前可以为您提供预测标签 我正在考虑尝试计算一个类的预测概率 假设所有实例都落在某个叶子下 构建 GBT 的代码 import org apache spark SparkContext import o
  • 构建具有继承的通用树

    我正在构建一个通用的Tree
  • 创建二叉树的时间复杂度

    我正在尝试从提供的源创建一棵树 要添加到树中的 2 个节点 以及应添加这 2 个新闻节点的节点 为了找到该节点在树中的位置 我使用了中序遍历 该遍历的时间复杂度为 O n 因此 如果要在树中添加 n 个节点 则创建整个树的时间复杂度为 O
  • D3可折叠树不同节点颜色

    我在 d3 js 中有一个可折叠的树 我的目标是通过 类型 属性为节点着色 例如 类型 str 的节点应填充为红色 而类型 elem 的节点应填充为绿色 我就是无法让它发挥作用 有人能帮助我吗 这是我的代码
  • 将 python NLTK 解析树保存到图像文件[重复]

    这个问题在这里已经有答案了 这可能会复制这个 stackoverflowquestion https stackoverflow com questions 23429117 saving nltk drawn parse tree to
  • 知识树中的段错误

    我正在用 c 实现一个可以从文件中读取的知识树 我的 newStr 函数出现段错误 我无法用这个问题测试我的其余代码 我对 c 没有太多经验 任何帮助将不胜感激 我的 c 文件 包括 包括 include 动物 h 包括 包括 return
  • 在 Python 中删除表达式树及其每个子表达式树中第一个元素周围的括号

    目标是实现简化操作 删除表达式树及其每个子表达式树中第一个元素周围的括号 其中表达式作为括在各个括号中的字符串输入给出 这必须适用于任意数量的括号 例如 12 3 45 6 gt 123 45 6 删除 12 周围的括号 然后删除 45 周
  • 如何在 R 中将字符串解析为层次结构或树

    有没有办法将表示组的字符串解析为 R 中的层次结构 假设我的小组结构如下 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 3 1 1 3 1 1 1 3 2 1 1 3 3 1 2 1 2 1 1 2 1 1 1 2 1 2 1
  • 应用对数来导航树

    我曾经知道一种使用对数从树的一片叶子移动到树的下一个 有序 叶子的方法 我认为它涉及获取 当前 叶子的位置值 排名 并将其用作从根向下到新目标叶子的新遍历的种子 一直使用对数函数测试来确定是否沿着右或左节点向下到达叶子 我已经不记得如何运用
  • 如何在 Flutter 的 widget 树中打开新的 MaterialPageRoute 作为子项

    在下面的示例中 当我推送新的 MaterialPageRoute 时 它 会在与 Flutter 小部件树中的 Home 小部件相同的级别上创建 我希望将它作为小部件 Home 的子部件 因此 Home 将是 Child 小部件的父部件 这
  • Scheme (Lisp) 中树的深度反转

    我对Scheme中的基本树数据结构进行了深度逆向 define deep reverse t cond null t not pair t t else cons deep reverse cdr t deep reverse car t
  • 比较两棵树的伪代码

    这是我遇到过几次的问题 并且不确信我使用了最有效的逻辑 例如 假设我有两棵树 一棵是文件夹结构 另一棵是该文件夹结构的内存 模型 我希望比较两棵树 并生成一棵树中存在的节点列表 而不是另一棵树中存在的节点列表 反之亦然 是否有公认的算法来处

随机推荐

  • 1127UI自动化测试经验分享-显式等待(一)WebDriverWait类、until()方法

    最近忙于其他事情 xff0c 博客就没那么多时间来写 原本想先分享下三种等待方式 xff0c 但是隐式等待我还有点不太懂 这次先分享显式等待 个人博客 xff1a https blog csdn net zyooooxie 一 xff09
  • OpenCV框架介绍

    OpenCV框架介绍 概述 OpenCV是一个开放源代码的计算机视觉应用平台 xff0c 由英特尔公司下属研发中心俄罗斯团队发起该项目 xff0c 开源BSD证书 xff0c OpenCV的目标是实现实时计算机视觉 xff0c xff0c
  • 1128UI自动化测试经验分享-显式等待(二)expected_conditions模块、visibility_of_element_located(locator)

    expected conditions模块 提供的预期条件判断类 模块包含一套预定义的条件集合 xff0c 大大方便了 WebDriverWait 的使用 个人博客 xff1a https blog csdn net zyooooxie 一
  • Requests.request()方法分享【一】

    最近参加了一次新公司测试团队技术分享会 xff0c 有大佬分享了关于接口自动化框架 python 43 requests 43 ddt 43 unittest 43 jenkins xff0c 印象很深刻的是他的脚本测试用例的设计和requ
  • 指针 Swap交换函数

    64 努力的张张 的C 练习 数组 指针地址传递 Swap函数 首先 xff0c 我们先来看一下普通值传递和地址传递的区别 函数间普通值传递 上代码 xff1a span class token macro property span cl
  • 用两个栈实现一个队列【C语言】

    问题描述 xff1a 考虑用两个栈实现队列这样的特殊结构 问题分析 xff1a 我们靠两个栈实现队列 xff0c 肯定是一个用来存放入队的数据 xff0c 一个用来出栈 xff0c 在这里我们主要关注这个样几个问题 xff1a 什么时候队列
  • 数据库安全 --- 创建登录名 用户+配置权限【笔记】

    项目场景 xff1a 创建用户和给用户授权 解决方案 xff1a 1 创建用户 至此用户才创建成功 xff1a 2 配置权限 把查询Student表权限授给用户test xff1a 把对Student表和Course表的全部权限授予用户U2
  • Visual C++6.0 一些编译链接报错解决

    01 VC 43 43 编写图形化界面链接时出现 LIBCD lib crt0 obj error LNK2001 unresolved external symbol main 的解决方案 在我使用VC 43 43 编写一个图形化显示界面
  • lambda表达式【C++】

    lambda表达式 lambda表达式是C 43 43 11最重要也是最常用的一个特性 lambda来源于函数式编程的概念 优点 xff1a 声明式编程风格 xff1a 就地匿名定义目标函数或函数对象 xff0c 不需要额外写一个命名函数或
  • Qt学习笔记 day_03

    目录 十三 自定义代理类的实现1 基于QSpinBox的自定义代理类的实现2 自定义代理类的使用3 xff09 setItemDelegateForColumn 函数的使用注意 十三 自定义代理类的实现 1 基于QSpinBox的自定义代理
  • 版本控制软件SVN

    SVN学习 1 版本控制软件定义及用途 版本控制软件是为适应软件配置管理的需要 xff0c 控制软件的修改 xff0c 减少混乱 xff0c 提高软件生产效率 xff0c 其是软件质量保证的重要环节软件配置管理是对软件修改进行标识 组织和控
  • 螺旋桨的制作图文教程

    一 螺旋桨的一些基础概念 当我们把螺旋桨看成是一个一面旋转一面前进的机翼时 xff0c 就能借助已知的空气动力学常识 xff0c 直观地理解螺旋桨的基本工作原理 1 xff0e 桨距 动力桨距和几何桨距 桨距 xff1a 从广义而言 xff
  • 自制2.4G ELRS接收机,不需要打板,容易制作

    制作难度 xff1a 中等 xff0c 主要是器件太小 xff0c 焊接需要耐心 一 硬件材料 1 LoRa射频模块 xff0c sx1280 xff1a E28 2G4M12S 2 MCU Wifi模块 xff1a ESP 01F 3 各
  • Qt学习笔记 【C++】(4)

    目录 一 Qt中的C 43 43 11标准二 Explicit Linking 和 Implicit Linking三 自动生成的ui xxx ui文件四 常用快捷键 一 Qt中的C 43 43 11标准 Qt 5 中开启C 43 43 1
  • 串口发送接收字符串的C语言代码参考

    通过串口把字符串数据从单片机U1发送到单片机U2 xff0c 通过U2的LCD602显示出来 LCD602显示代码是用的一个比较不错的现成的显示代码 单片机串口传字符串 xff0c 主要是利用字符串的格式的特点 xff0c 在传输中结束串口
  • HTTP协议解析

    HTTP概述 HTTP 全称为 34 超文本传输协议 34 是一种应用非常广泛的应用层协议 我们平时打开一个网站 就是通过 HTTP 协议来传输数据的 HTTP工作过程 xff1a 当我们在浏览器中输入一个 34 网址 34 xff0c 此
  • 《算法导论》学习心得

    第四章 分治策略 xff08 1 xff09 Master Method中case 3中 正则条件 的含义 xff1a 保证f n 在每次递归后都比上一层小 xff08 非递增 xff09 否则显然T n gt f n xff08 2 xf
  • 《算法导论》 第11章部分答案

    注 xff1a 以下答案均为自己思考 xff0c 难免有误 xff0c 欢迎指正 11 3 1 xff1a 将长度为n的链表进行排序 xff0c 将关键值的散列值相同的元素排为相邻 而散列表有点类似于链接法解决冲突的散列表 11 3 2 x
  • 算法刷题心得:动态规划 scramble-string

    牛客网 gt 在线编程 gt letcode gt scramble string Given a string s1 we may represent it as a binary tree by partitioning it to t
  • POJ 1635 Subway tree systems

    题目 xff1a Some major cities have subway systems in the form of a tree i e between any pair of stations there is one and o