首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

poj1635 - Subway tree systems

  • 24-03-05 07:01
  • 3708
  • 9975
blog.csdn.net

                                  想看更多的解题报告: http://iyenn.com/rec/1824570.html
                                  转载请注明出处:http://blog.csdn.net/wangjian8006

题目大意:给出两串含有‘1’和‘0’的字符串,0表示向下搜索,1表示回溯,这样深搜一颗树
深搜完之后问这两棵树是不是同一棵树,因为树的结点顺序不同,所以可以导致树深搜的序列也不同

解题思路:其实画下样例答案显然易见,因为如果树是相同的,那么每个结点的子节点个数必然相同,
子节点可以看做成是某个结点可以深搜到的结点
我们只需要将所有的结点的子节点个数,然后【排序】之后比较每个结点的个数是否相同。因为排序之后
就是按子节点大小排序了,这样比较就是一个确定的顺序了
然后我们分析下字符串,树的结点数=‘0’的个数+根节点,我们计算子节点数可以将字符串里面的都求出来,
如果哪个下标是1,就将子节点数赋值为0即可,其实不影响什么

关于计算每个结点的子节点数,可以定义一个父亲数组,然后对每个结点都往根节点搜索,那么父亲结点的
子节点就+1,这样循环一边全部的结点就可以得出答案

因为字符串不超过3000,所有用short int即可
如果每个结点的个数相同输出same否则输出different

 

  1. /*
  2. Memory 188K
  3. Time 16MS
  4. */
  5. #include
  6. #include
  7. using namespace std;
  8. #define MAXV 3010
  9. short int cnt[MAXV],cnt1[MAXV]; //计算字符串下标对应的子节点个数
  10. char str[2][MAXV]; //输入的字符串
  11. short int pr[MAXV]; //记录每个下标的父亲结点是哪个,‘1’和根结点就是-1
  12. short int len[2]; //定义字符串长度
  13. int cmp(const void *a,const void *b){
  14. return *(short int *)b-*(short int *)a;
  15. }
  16. void Getparent(int x){
  17. int i,node=0;
  18. memset(pr,-1,sizeof(pr));
  19. for(i=1;i
  20. if(str[x][i]=='0'){ //为‘0’就代表node是i的父亲结点,然后把i赋给node
  21. pr[i]=node;
  22. node=i;
  23. }
  24. else node=pr[node]; //为‘1‘就node回溯到其父亲数组
  25. }
  26. }
  27. void Getcnt(int x){
  28. short int i,tmp;
  29. for(i=0;i//对每个结点搜索
  30. tmp=i;
  31. while(tmp!=-1){ //不断寻找其父亲结点,让其父亲结点的子节点数+1
  32. tmp=pr[tmp];
  33. if(tmp!=-1)
  34. if(!x) cnt[tmp]++;
  35. else cnt1[tmp]++;
  36. }
  37. }
  38. }
  39. int main(){
  40. int i,Case;
  41. scanf("%d",&Case);
  42. while(Case--){
  43. scanf("%s%s",str[0],str[1]);
  44. len[0]=strlen(str[0]);
  45. len[1]=strlen(str[1]);
  46. if(len[0]!=len[1]){printf("different\n");continue;}
  47. memset(cnt,0,sizeof(cnt));
  48. memset(cnt1,0,sizeof(cnt1));
  49. Getparent(0); //得到字符串1的所有结点的父亲数组
  50. Getcnt(0); //计算字符串1的结点的子节点数
  51. Getparent(1); //得到字符串2的所有结点的父亲数组
  52. Getcnt(1); //计算字符串2的结点的子节点数
  53. qsort(cnt,len[0],sizeof(cnt[0]),cmp); //对两串字符串排序
  54. qsort(cnt1,len[1],sizeof(cnt1[0]),cmp);
  55. for(i=0;i0];i++){ //比较各个结点子节点数,看是不是依次对应
  56. if(cnt[i]!=cnt1[i]) break;
  57. }
  58. if(i==len[0]) printf("same\n");
  59. else printf("different\n");
  60. }
  61. return 0;
  62. }


 

注:本文转载自blog.csdn.net的wangjian8006的文章"http://blog.csdn.net/wangjian8006/article/details/7972883"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top