树的最小表示法 poj1635 Subway tree systems

传送门:点击打开链接

题意:有根树,0表示远离根节点,1表示接近根节点,一条边只访问一次。现在告诉你两种访问方式,问这两棵树是否同构异形。

思路:从下向上把子树排序,这样向上,最后表示出来的就是最小表示的了,那么就有序了,就可以直接比较字符串就能判断两棵树是否相同。

#include<map>
#include<set>
#include<cmath>
#include<ctime>
#include<stack>
#include<queue>
#include<cstdio>
#include<cctype>
#include<string>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<functional>
#define fuck(x) cout<<"["<<x<<"]"
#define FIN freopen("input.txt","r",stdin)
#define FOUT freopen("output.txt","w+",stdout)
using namespace std;
typedef long long LL;

const int MX = 1e4 + 5;

char S[MX];

string solve(int l, int r) {
    int cnt = 0, p = l;
    vector<string>tmp;
    for(int i = l; i <= r; i++) {
        if(S[i] == '0') cnt++;
        else cnt--;

        if(cnt == 0) {
            tmp.push_back(solve(p + 1, i -1));
            p = i + 1;
        }
    }
    sort(tmp.begin(), tmp.end());
    string ret = "0";
    for(int i = 0; i < (int)tmp.size(); i++) {
        ret += tmp[i];
    }
    return ret + "1";
}

int main() {
    int T; //FIN;
    scanf("%d", &T);
    while(T--) {
        scanf("%s", S);
        string a = solve(0, strlen(S) - 1);
        scanf("%s", S);
        string b = solve(0, strlen(S) - 1);
        if(a == b) printf("same\n");
        else printf("different\n");
    }
    return 0;
}


你可能感兴趣的:(树的最小表示法 poj1635 Subway tree systems)