樹的同構 poj 1635

2021-07-15 12:19:36 字數 1436 閱讀 5054

判斷兩個有根樹是否同構。

判斷兩個有根樹是否同構,本質上是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...