判斷兩個有根樹是否同構。
判斷兩個有根樹是否同構,本質上是hash應用,每個點的權值是這個子樹的權值和。樹上某一組合不同都會導致最終結構的不同。
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
const
int maxn = 3000+10;
typedef
long
long ll;
vector
g1[maxn];
vector
g2[maxn];
int p1[maxn], p2[maxn];
struct hash
hash(char c):length(1), value(c){}
hash(int l, ll v):length(l), value(v){}
bool
operator
< (const hash &a) const
return res;
}hash operator + (const hash &a, const hash &b)
void
operator += (hash &a, const hash &b)
vector
child[maxn];
hash dfs(int pre, int cur, vector
g[maxn])
sort(child[cur].begin(), child[cur].end());
for (int i=0; i'(' + ret + ')';
return ret;
}ll gethash(int root, vector
m[maxn])
int main()
}char p[maxn];
scanf("%s", p);
int plen = strlen(p);
t = 0;
now = 0;
for (int i=0; iif (p[i] == '1')
now = p2[now];
else
}if (slen != plen)
ll tree1 = gethash(0, g1);
ll tree2 = gethash(0, g2);
if (tree1 == tree2)
puts("same");
else
puts("different");
}return
0;}
poj 1635 樹的同構
思路 因為題目要求的是o n2 的演算法,而且是樹不是圖,所以思路比較隨意,先找每個節點的爸爸,然後記錄每個節點有多少個子孫 包括兒子的兒子 然後只有排序之後每個都一樣,那樹就同構,如果題目要求o n 的話,就不能找爸爸,直接找兒子,然後深搜。你還是看 吧,我感覺我說的不清楚 include inc...
poj1635 樹的同構
題意 這個題首先給出乙個01序列,這個序列的意思是,從乙個樹的根開始遍歷,遇到0走到乙個孩子,遇到1則當前節點返回到它的父親節點,最後回到樹的根。求對這樣兩個01序列進行遍歷後形成的兩顆樹是否同構。分析 1.這個序列中的0和1個數必須相同,否則無法回到根。有幾個0就有幾個節點。2.遍歷01序列建樹,...
樹 樹的同構
給定兩棵樹t1和t2。如果t1可以通過若干次左右孩子互換就變成t2,則我們稱兩棵樹是 同構 的。例如圖1給出的兩棵樹就是同構的,因為我們把其中一棵樹的結點a b g的左右孩子互換後,就得到另外一棵樹。而圖2就不是同構的。圖1 圖2輸入給出2棵二叉樹樹的資訊。對於每棵樹,首先在一行中給出乙個非負整數n...