zoukankan      html  css  js  c++  java
  • 【POJ】【1635】Subway Tree Systems

    树的最小表示法


      给定两个有根树的dfs序,问这两棵树是否同构

      题解:http://blog.sina.com.cn/s/blog_a4c6b95201017tlz.html

    题目要求判断两棵树是否是同构的,思路是用树的最小表示法去做。这里用的最小表示法就是将树的所有子树分别用1个字符串表示,要按字典序排序将他们依依连接起来。连接后如果两个字符串是一模一样的,那么他们必然是同构的。这样原问题就变成了子问题,子树又是一颗新的树。

     1 Source Code
     2 Problem: 1635        User: sdfzyhy
     3 Memory: 1160K        Time: 672MS
     4 Language: G++        Result: Accepted
     5 
     6     Source Code
     7 
     8     //PKUSC 2013 R1 C
     9     #include<string>
    10     #include<vector>
    11     #include<cstdio>
    12     #include<cstring>
    13     #include<cstdlib>
    14     #include<iostream>
    15     #include<algorithm>
    16     #define rep(i,n) for(int i=0;i<n;++i)
    17     #define F(i,j,n) for(int i=j;i<=n;++i)
    18     #define D(i,j,n) for(int i=j;i>=n;--i)
    19     #define pb push_back
    20     using namespace std;
    21     typedef long long LL;
    22     inline int getint(){
    23         int r=1,v=0; char ch=getchar();
    24         for(;!isdigit(ch);ch=getchar()) if (ch=='-') r=-1;
    25         for(; isdigit(ch);ch=getchar()) v=v*10-'0'+ch;
    26         return r*v;
    27     }
    28     const int N=3010;
    29     /*******************template********************/
    30     string s1,s2;
    31 
    32     string dfs(string s){
    33         vector<string>a;
    34         string ans="";
    35         int t=0,st=0;
    36         rep(i,s.length()){
    37             if (s[i]=='0') t++;
    38             else t--;
    39             if (t==0){
    40                 if (i-1 > st+1){
    41                     a.pb("0"+dfs(s.substr(st+1,i-1-st))+"1");
    42                 }else a.pb("01");
    43                 st=i+1;
    44             }
    45         }
    46         sort(a.begin(),a.end());
    47         rep(i,a.size()) ans=ans+a[i];
    48         return ans;
    49     }
    50 
    51     int main(){
    52     #ifndef ONLINE_JUDGE
    53         freopen("C.in","r",stdin);
    54         freopen("C.out","w",stdout);
    55     #endif 
    56         int T=getint();
    57         while(T--){
    58             cin >> s1 >> s2;
    59             if (dfs(s1)==dfs(s2)) puts("same");
    60             else puts("different");
    61         }
    62         return 0;
    63     }
    View Code
    Subway tree systems
    Time Limit: 1000MS   Memory Limit: 10000K
    Total Submissions: 7060   Accepted: 2935

    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

    2
    0010011101001011
    0100011011001011
    0100101100100111
    0011000111010101

    Sample Output

    same
    different

    Source

    [Submit]   [Go Back]   [Status]   [Discuss]

  • 相关阅读:
    opengl编程指南
    Binder机制1---Binder原理介绍
    [Android]使用platform密钥来给apk文件签名的命令
    IntentFilter
    最高分是多少
    Spring注入
    Bean容器的初始化
    Spring中的Junit
    IOC
    接口及面向接口编程
  • 原文地址:https://www.cnblogs.com/Tunix/p/4534372.html
Copyright © 2011-2022 走看看