您的位置:首页 > 其它

POJ 1635 Subway tree systems (树的同构)

2012-08-08 19:13 344 查看
题意:给出2个深搜过程,确定是否是对同一棵树的遍历。深搜过程是用01串来描述的,0代表远离树根,1代表靠近树根。

分析:利用最小表示的思想,我们将树的所有结点按一定的规则排个序,然后比较2棵树的结点是否一样即可。排序规则:先按深度排序(离树根的距离),深度相同的按以该结点为根的子树结点数目排序。其实排序的过程就是统一遍历规则的过程,利用上面的规则排序后的结点是一个宽度优先的搜索顺序,且同一层中按后代结点数目小的先遍历。

View Code

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 3010
struct node
{
int dep,son;
};
node tree1
,tree2
;
char s
;
int len1,len2;

int cmp(const void *a,const void *b)
{
node *c=(node*)a;
node *d=(node*)b;
if(c->dep==d->dep)  return  c->son-d->son;
return c->dep-d->dep;
}
void init()
{
memset(tree1,0x3f,sizeof(tree1));
memset(tree2,0x3f,sizeof(tree2));
}
void build(node *tree,char *s)
{
int i,j,dep=0;
for(i=0;s[i];i++)
{
if(s[i]=='0')
{
dep++;
tree[i].dep=dep;
int cnt=1,son=0;
for(j=i+1;cnt && s[j];j++)
{
if(s[j]=='0')   cnt++,son++;
if(s[j]=='1')   cnt--;
}
tree[i].son=son;
}
else    dep--;
}
}
void solve()
{
qsort(tree1,len1,sizeof(tree1[0]),cmp);
qsort(tree2,len2,sizeof(tree2[0]),cmp);
int i;
for(i=0;tree1[i].dep<len1;i++)
{
if(tree1[i].dep^tree2[i].dep)   break;
if(tree1[i].son^tree2[i].son)   break;
}
if(tree1[i].dep<len1 || (len1^len2))  puts("different");
else    puts("same");
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
init();
scanf("%s",s);
len1=strlen(s);
build(tree1,s);
scanf("%s",s);
len2=strlen(s);
build(tree2,s);
solve();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: