天梯賽補題 - 樹的同構

我居然連這種遞歸不太會寫了
直接暴力ASCII值作爲下標開點233
注意0 0的情況


#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <string>
#include <set>
#include <vector>
#include <cmath>
#define LL long long
#define eps 1e-8
const LL INF = 0x3f3f3f3f;
const int maxn = 2000 + 5;
using namespace std;
bool vis[maxn];
struct node{
    char cur,l,r;
    node(){}
    node(char c, char ll, char rr):cur(c),l(ll),r(rr){}
}tree1[maxn],tree2[maxn];
bool solve(int rt1, int rt2){
    if(rt1 == '-' && rt2 == '-') return true;
    if(rt1 == '-' && rt2 != '-') return false;
    if(rt1 != '-' && rt2 == '-') return false;
    if(tree1[rt1].cur != tree2[rt2].cur) return false;
    if(tree1[rt1].l == '-' && tree2[rt2].l == '-') return solve(tree1[rt1].r, tree2[rt2].r);
    if(tree1[rt1].r == '-' && tree2[rt2].r == '-') return solve(tree1[rt1].l, tree2[rt2].l);
    if(tree1[rt1].l == tree2[rt2].l && tree1[rt1].r == tree2[rt2].r)
        return solve(tree1[rt1].l,tree2[rt2].l) && solve(tree1[rt1].r, tree2[rt2].r);
    return solve(tree1[rt1].l, tree2[rt2].r) && solve(tree1[rt1].r ,tree2[rt2].l);
}
int main(){
    int n,m;
    int rt1 = 0, rt2 = 0;
    scanf("%d",&n);
    char x,y,z;
    memset(vis, false, sizeof(vis));
    for(int i=0; i<n; i++){
        getchar();
        scanf("%c %c %c",&x,&y,&z);
        vis[y] = true;
        vis[z] = true;
        tree1[i+'0'] = node(x,y,z);
    }
    for(int i=0; i<n; i++){
        if(!vis[i+'0']) {
            rt1 = i+'0';
            break;
        }
    }
    memset(vis, false, sizeof(vis));
    scanf("%d",&m);
    for(int i=0; i<m; i++){
        getchar();
        scanf("%c %c %c",&x,&y,&z);
        tree2[i+'0'] = node(x,y,z);
        vis[y] = true;
        vis[z] = true;
    }
    for(int i=0; i<m; i++){
        if(!vis[i+'0']) {
            rt2 = i+'0';
            break;
        }
    }
    if(n == 0 && m == 0) printf("Yes\n");
    else if(solve(rt1,rt2)) printf("Yes\n");
    else printf("No\n");
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章