poj-1635 Subway tree systems(判断两个有根树是否同构)-哈希法
来源:互联网 发布:matlab优化种类 编辑:程序博客网 时间:2024/06/06 20:09
Description
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.
Input
On the first line of input is a single positive integer n, telling the number of test scenarios to follow.Each test scenario consists of two lines, each containing a string of the characters '0' and '1' of length at most 3000, both describing a correct exploration tour of a subway tree system.
Output
exploration tours of the same subway tree system, or the text "different" if the two strings cannot be exploration tours of the same subway tree system.
Sample Input
20010011101001011010001101100101101001011001001110011000111010101
Sample Output
samedifferent其实题目意思就是求两个有根树是否同构,这个如果暴力法枚举的话,复杂度是O(N^2),一中经典的做法是哈希,思想就是使得不同结构的树哈希值不同,而同构的树哈希值相同。
我这个也是参考别人写的,不同的是我先把01串转换为了树状结构表示,然后再递归求哈希值,这样好理解一点。
哈希的策略:先随机产生一系列随机数作为存到数组,接着从根节点出发,递归计算每个子树的哈希值,将子树的哈希值相加然后和父节点自己对应的数组上的随机数相加得到父节点的哈希值。这个计算结果和子树的顺序是没有关系的,所以同构的树一哈希值一定是一样的。对于异构的树,必然在某些节点计算的哈希值不同,由于都是随机产生的一些数字,所以他们相加值和另外一棵树哈希值相同的概率也会非常低。(应该不能完全保证的,这里我们加了个取模m的操作,根据鸽巢原理,当树的数量超过m,必然有两个树的哈希值是会相同的,但这两个树却未必是同构的,不知道大家觉得对不对?)
import java.util.*;public class SubwayTreeSstems1635 {static final int Hn=11000;static int h[]=new int[Hn];static Random rand=new Random(System.currentTimeMillis());static int m=1000000007;static int index=0;/** * @param args */public static void main(String[] args) {run();}private static void init() {for(int i=0;i<Hn;i++)h[i]=(rand.nextInt()%m);}public static void run(){Scanner in=new Scanner(System.in);int T=in.nextInt();init();for(int t=0;t<T;t++){String s1=in.next();Node tree1=createTree(s1);String s2=in.next();Node tree2=createTree(s2);/*System.out.println(tree1.children.size()+" "+tree2.children.size());displayTree(tree1);System.out.println();displayTree(tree2);*/int a=hash(tree1,1);int b=hash(tree2,1);//System.out.println(a+" "+b);if(a==b){System.out.println("same");}else{System.out.println("different");}}}public static int hash(Node tree,int j){int sum=h[j+5000];//j是树的高度for(Node n:tree.children)sum=(sum+h[j]*hash(n,j+1))%m;//把子树的哈希值加到父节点上去return (sum*sum)%m;}private static Node createTree(String s) {char[] seq=s.toCharArray();Node root=new Node(0);Node p=root;int index=1;for(int i=0;i<seq.length;i++){if(seq[i]=='0'){Node node =new Node(index++);connect(p,node);p=node;}else if(seq[i]=='1'){p=p.parent;}}//if(p==root)//System.out.println("create success!");return root;}private static void connect(Node p, Node node) {node.parent=p;p.children.add(node);}public static void displayTree(Node tree){System.out.println(tree);for(Node ch:tree.children)displayTree(ch);}}class Node{int id;Node parent=null;List<Node> children=new ArrayList<Node>();public Node(int n){id=n;}public String toString(){StringBuilder sb=new StringBuilder();sb.append(id).append(": ");for(Node n:children)sb.append(n.id).append(" ");return sb.toString();}}
2 0
- poj-1635 Subway tree systems(判断两个有根树是否同构)-哈希法
- poj 1635 Subway tree systems 判断是否是同构树
- POJ 1635 Subway tree systems(HASH+判断两棵有根树是否同构)
- poj 1635 Subway tree systems(树的同构,经典)
- poj 1635 Subway tree systems (树同构)
- poj 1635 Subway tree systems 判断树的同构 树的最大最小表示法模板
- [POJ1635]Subway tree systems 判断有根树的同构 有根树哈希
- POJ 1635 Subway tree systems
- poj 1635 Subway tree systems
- poj 1635 Subway tree systems
- POJ 1635 Subway tree systems
- poj 1635 Subway tree systems
- POJ 1635 Subway tree systems
- POJ 1635 Subway tree systems
- POJ 1635 Subway tree systems
- POJ 1635 Subway tree systems
- pku 1635 Subway tree systems(树的同构,最小表示)
- Poj 1635 Subway tree systems (树的最小表示)
- 限贷放松难阻楼市低迷
- C++ 字符数组函数与string函数
- android ListView详解
- 提高学习能力的三要素!
- eetr4gtyhyt
- poj-1635 Subway tree systems(判断两个有根树是否同构)-哈希法
- 我一直喜欢下午的阳光。它让我相信这个世界任何事情都会有转机,相信命运的宽厚和美好。我们终归要长大,带着一种无怨的心情悄悄地长大。归根到底,成长是一种幸福。
- 嵌入式C语言知识点
- iOS程序发布测试2-获取Tester设备UDID
- 浅析十三种常用的数据挖掘的技术&五个免费开源的数据挖掘软件
- Xtrace ios中强大的调试的库
- QT画图
- 有志者 事竟成
- Java之运行时异常与编译时异常区别