您的位置:首页 > 其它

POJ 1635 Subway tree systems(树同构)

2012-10-29 10:21 513 查看
题目链接:http://poj.org/problem?id=1635

题意:给出从根节点遍历树的两种方式,判断这两种方式是否是同一棵树。

思路:树的最小表示,其实就是对于根节点的若干子树DFS后重新排序。。。。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define min(x,y) ((x)<(y)?(x):(y))
using namespace std;

struct node
{
int L,R;
};

const int MAX=3005;
node a[MAX];
char s[MAX],A[MAX],B[MAX],temp[MAX];
int n,C;

int cmp(node a,node b)
{
int len=min(a.R-a.L+1,b.R-b.L+1);
int i;
for(i=0;i<len;i++) if(s[a.L+i]!=s[b.L+i])
return s[a.L+i]<s[b.L+i];
return a.R-a.L<b.R-b.L;
}

void DFS(int L,int R,node *a)
{
int pre=L,i,j,x=0,cnt=0;
for(i=L;i<=R;i++)
{
if(s[i]=='0') x++;
else x--;
if(!x)
{
DFS(pre+1,i-1,&a[cnt]);
a[cnt].L=pre;
a[cnt].R=i;
cnt++;
pre=i+1;
}
}
sort(a,a+cnt,cmp);
x=0;
for(i=0;i<cnt;i++) for(j=a[i].L;j<=a[i].R;j++) temp[x++]=s[j];
x=0;
for(i=L;i<=R;i++) s[i]=temp[x++];
}

int main()
{
for(scanf("%d",&C);C--;)
{
scanf("%s",s); n=strlen(s); DFS(0,n-1,a); strcpy(A,s);
scanf("%s",s); n=strlen(s); DFS(0,n-1,a); strcpy(B,s);
if(strcmp(A,B)) puts("different");
else puts("same");
}
return 0;
}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: