poj1635树的最小表示法,用于判断树的同构

来源:互联网 发布:seo 推广 编辑:程序博客网 时间:2024/04/27 17:01

#include <string>   
#include <vector>   
#include <cmath>   
#include <queue>   
#include <algorithm>   
#include <iostream>   
using namespace std;   
string min_pre(string str)//必须保证str是树的表示。如果是str随机01序列,则下面的代码会出错,需要给出跳出的条件。   
{   
    int start=0,end;   
     vector<string> box;   
     string temp;   
    int depth=0;   
    for(int i=0;str[i];i++)   
     {   
         depth+=str[i]=='0'?1:-1;//0表示深度+1,1则表示深度-1   
        if(depth==0)//深度回到0,说明得到了一棵子树   
         {   
             end=i;   
             temp=string("0")+min_pre(str.substr(start+1,end-start+1-1))+string("1");//去掉子树首位的0和末位的1,往里走一层,递归寻找子树的最小表示   
             box.push_back(temp);   
             start=end+1;   
         }   
     }   
     sort(box.begin(),box.end());   
     string ret;   
    for(int p=0;p<box.size();p++) ret+=box[p];   
    return ret;//返回最小表示   
}   
int main()   
{   
    int T;   
     scanf("%d",&T);   
     string s1,s2;   
    for(int t=0;t<T;t++)   
     {   
         cin>>s1>>s2;   
         s1=min_pre(s1);   
         s2=min_pre(s2);   
        if(s1==s2) printf("same/n");   
        else printf("different/n");   
     }   
        return 0;   
}  

原创粉丝点击