poj1635 树的最小表示

建树时把每个节点的深度,子节点数记下来,排个序比一下就可以判断同构。

#include <iostream> #include <string> #include <algorithm> using namespace std; struct tree { int dep,s; }a[2000],b[2000]; bool cmp(tree a,tree b) { return (a.s<b.s || (a.s==b.s && a.dep<b.dep)); } int main() { string s; int n,cnt,i,top,t,d[2000]; cin >> n; while (n--) { cin >> s; cnt=1; memset(d,0,sizeof(d)); top=1; d[top]=1; a[cnt].dep=1; a[cnt].s=1; for (i=0;i<s.length();i++) if (s[i]=='0') { a[++cnt].dep=a[d[top]].dep+1; a[cnt].s=1; d[++top]=cnt; } else { t=a[d[top]].s; a[d[--top]].s+=t; } cin >> s; cnt=1; memset(d,0,sizeof(d)); top=1; d[top]=1; b[cnt].dep=1; b[cnt].s=1; for (i=0;i<s.length();i++) if (s[i]=='0') { b[++cnt].dep=b[d[top]].dep+1; b[cnt].s=1; d[++top]=cnt; } else { t=b[d[top]].s; b[d[--top]].s+=t; } sort(a+1,a+cnt+1,cmp); sort(b+1,b+cnt+1,cmp); bool flag=true; for (i=1;i<=cnt;i++) if (a[i].s!=b[i].s || a[i].dep!=b[i].dep) flag=false; if (flag) printf("same/n"); else printf("different/n"); } //system("pause"); return 0; }

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