1. 程式人生 > >POJ1635 Subway tree systems ——(判斷樹的同構,樹的最小表示法)

POJ1635 Subway tree systems ——(判斷樹的同構,樹的最小表示法)

systems scan color end cto 同構 while scanf urn

  給兩棵有根樹,判斷是否同構。因為同構的樹的最小表示法唯一,那麽用最小表示法表示這兩棵樹,即可判斷同構。順便如果是無根樹的話可以通過選出重心以後套用之前的方法。

  AC代碼如下:

 1 #include <stdio.h>
 2 #include <algorithm>
 3 #include <string.h>
 4 #include <string>
 5 #include <iostream>
 6 #include <vector>
 7 using namespace std;
 8 
 9 string
str1, str2; 10 11 string min_pre(string str){ 12 vector<string> box; 13 string ret = ""; 14 int equal = 0, st = 0; 15 for(int i = 0; i < str.size(); i++){ 16 if(str[i] == 0) equal++; 17 else equal--; 18 if(equal == 0){ 19 if
(i - 1 > st + 1){ 20 box.push_back("0" + min_pre(str.substr(st + 1,i - 1 - st)) + "1"); 21 }else box.push_back("01"); 22 st = i + 1; 23 } 24 } 25 sort(box.begin(), box.end()); 26 for(int i = 0; i < box.size(); i++) ret += box[i];
27 return ret; 28 } 29 30 int main(){ 31 int ca; 32 scanf("%d", &ca); 33 while(cin >> str1 >> str2){ 34 if(min_pre(str1) == min_pre(str2)) printf("same\n"); 35 else printf("different\n"); 36 } 37 }

  另外,如果是問a樹是否是b樹的子樹,只要用kmp判斷a的最小表示法是不是b的最小表示法的子串即可。

POJ1635 Subway tree systems ——(判斷樹的同構,樹的最小表示法)