poj1635_树的同构

题意:

这个题首先给出一个01序列,这个序列的意思是,从一个树的根开始遍历,遇到0走到一个孩子,遇到1则当前节点返回到它的父亲节点,最后回到树的根。求对这样两个01序列进行遍历后形成的两颗树是否同构。

分析:

1.这个序列中的0和1个数必须相同,否则无法回到根。有几个0就有几个节点。

2.遍历01序列建树,记录每个节点的深度和孩子个数,然后排序进行比较。

3.一开始,我记录每个节点的孩子个数仅限于孩子(没有记录孙子,曾孙等),结果WA了。应该记录每个节点的所有后代的个数。

4.这道题我用的是静态链表。

代码:

View Code
  1 #include <iostream>

  2 #include <stdio.h>

  3 #include <memory.h>

  4 #include <string>

  5 #include <algorithm>

  6 using namespace std;

  7 const int maxnum=1505;

  8 

  9 struct node

 10 {

 11     int depth;

 12     int child_num;  //儿子及其以下的节点个数

 13     int parent;

 14 }list[maxnum],llist[maxnum];

 15 int use,Use;

 16 

 17 void Init()

 18 {

 19     int i;

 20     for(i=0;i<maxnum;i++)

 21     {

 22         list[i].child_num=0;

 23         list[i].parent=-1;

 24     }

 25     list[0].depth=0;

 26     list[0].child_num=1;

 27 

 28     for(i=0;i<maxnum;i++)

 29     {

 30         llist[i].child_num=0;

 31         llist[i].parent=-1;

 32     }

 33     llist[0].depth=0;

 34     llist[0].child_num=1;

 35 }

 36 

 37 bool compare(struct node a,struct node b)

 38 {

 39     if(a.depth==b.depth)

 40         return a.child_num<b.child_num;

 41     else

 42         return a.depth<b.depth;

 43 }

 44 

 45 void fuction()

 46 {

 47     int i;

 48     int p,len;

 49     string s;

 50     cin>>s;

 51     len=s.size();

 52     p=0;

 53     use=1;

 54     for(i=0;i<len;i++)

 55     {

 56         if(s[i]=='0')

 57         {

 58            list[use].child_num=1;

 59            list[use].depth=list[p].depth+1;

 60            list[use].parent=p;

 61            p=use;

 62            use++;

 63         }

 64         else

 65         {

 66             int t=list[p].child_num;

 67             p=list[p].parent;

 68             list[p].child_num+=t;

 69         }

 70     }

 71     sort(list,list+use,compare);

 72 //    for(i=0;i<use;i++)

 73 //        cout<<list[i].depth<<" "<<list[i].child_num<<endl;

 74 //    cout<<endl;

 75 }

 76 

 77 void Fuction()

 78 {

 79     int i;

 80     int p,len;

 81     string s;

 82     cin>>s;

 83     len=s.size();

 84     p=0;

 85     Use=1;

 86     for(i=0;i<len;i++)

 87     {

 88         if(s[i]=='0')

 89         {

 90             llist[Use].child_num=1;

 91             llist[Use].depth=llist[p].depth+1;

 92             llist[Use].parent=p;

 93             p=Use;

 94             Use++;

 95         }

 96         else

 97         {

 98             int t=llist[p].child_num;

 99             p=llist[p].parent;

100             llist[p].child_num+=t;

101         }

102     }

103     sort(llist,llist+Use,compare);

104 //    for(i=0;i<Use;i++)

105 //        cout<<llist[i].depth<<" "<<llist[i].child_num<<endl;

106 }

107 

108 bool same()

109 {

110     if(use!=Use)

111         return false;

112     int i;

113     for(i=0;i<use;i++)

114     {

115         if(list[i].depth!=llist[i].depth)

116             return false;

117         if(list[i].child_num!=llist[i].child_num)

118             return false;

119     }

120     return true;

121 }

122 

123 int main()

124 {

125     int num;

126     scanf("%d",&num);

127     while(num--)

128     {

129         Init();

130         fuction();

131         Fuction();

132         if(same())

133             printf("same\n");

134         else

135             printf("different\n");

136     }

137     return 0;

138 }

139 /*

140 3

141 0010011101001011

142 0100011011001011

143 0010011101001011

144 0100011011001011

145 0100101100100111

146 0011000111010101

147 */

tjuoj 1503

你可能感兴趣的:(poj)