SDUT 3340 树的同构
Posted taming
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SDUT 3340 树的同构相关的知识,希望对你有一定的参考价值。
链接:http://acm.sdut.edu.cn/onlinejudge2/index.php/Home/Index/problemdetail/pid/3340.html
思路:
很常见的思路,将两颗树格式化,然后xjb比较一下就ok了
当然我这里用的是比较偷懒的写法,格式化后通过比较先序序列是否相同
格式化可以根据左右孩子节点的值来排列左右两个节点谁在左谁在右
但需要注意的一点是题目没有给出根节点,要先找出根节点
#include<bits/stdc++.h> using namespace std; const int maxN=15; struct node{ char c; int l,r,p; node():l(-1),r(-1),p(-1){} }a[maxN],b[maxN]; void format(node t[],int r){ if(~t[r].l)format(t,t[r].l); if(~t[r].r)format(t,t[r].r); if(t[r].l==-1)swap(t[r].l,t[r].r); else if(t[r].r!=-1&&t[r].l!=-1&&t[t[r].l].c>t[t[r].r].c)swap(t[r].l,t[r].r); } void dfs(node t[],int r,string& s){ s+=t[r].c; if(~t[r].l)dfs(t,t[r].l,s); if(~t[r].r)dfs(t,t[r].r,s); } int find(node t[],int x){ if(t[x].p==-1)return x; else return find(t,t[x].p); } int main(){ int m,n; char c,l,r; while(cin>>m){ memset(a,-1,sizeof(a)); memset(b,-1,sizeof(b)); for(int i=0;i<m;i++){ cin>>c>>l>>r; a[i].c=c; if(l!=‘-‘){ a[i].l=l-‘0‘; a[l-‘0‘].p=i; } if(r!=‘-‘){ a[i].r=r-‘0‘; a[r-‘0‘].p=i; } } cin>>n; for(int i=0;i<n;i++){ cin>>c>>l>>r; b[i].c=c; if(l!=‘-‘){ b[i].l=l-‘0‘; b[l-‘0‘].p=i; } if(r!=‘-‘){ b[i].r=r-‘0‘; b[r-‘0‘].p=i; } } if(m!=n){ cout<<"No"<<endl; continue; } int ra=find(a,0),rb=find(b,0); format(a,ra); format(b,rb); string pa,pb; dfs(a,ra,pa); dfs(b,rb,pb); if(pa==pb)cout<<"Yes"<<endl; else cout<<"No"<<endl; } }
以上是关于SDUT 3340 树的同构的主要内容,如果未能解决你的问题,请参考以下文章
POJ1635 Subway tree systems ——(判断树的同构,树的最小表示法)