HDU5732 Subway 樹重心 樹雜湊

2022-08-18 18:24:11 字數 1369 閱讀 6914

hdu5732 subway

給出兩棵大小為\(n\)的同構樹,要求輸出對應的節點

\(n\le 10^5\)

由於重心最多只有兩個,找到重心之後以重心為根進行樹雜湊,找到相同雜湊值的根之後遞迴輸出即可

輸出兒子的時候要先對雜湊值排序,保證遞迴進去的兒子節點也是同構的

這裡用的雜湊方法是\(f[u] = 1 + \sum_f[v]\cdot prime[sz[v]]\)

view code

//#pragma gcc optimize("o3")

//#pragma comment(linker, "/stack:1024000000,1024000000")

#includeusing namespace std;

function____ = ();

typedef uint64_t ull;

const int maxn = 2e5+7;

vectorprime;

void sieve()

}}int n;

struct tree

int getid(string &s)

return msk[s];

}void dfs(int u, int f)

maxsz[u] = max(maxsz[u],tot-sz[u]);

}void gethash(int u, int f)

}}tr[2];

void match(int u0, int u1, int f0, int f1));

sort(tr[1].g[u1].begin(),tr[1].g[u1].end(),[&](const int &x, const int &y));

int m = (int)tr[0].g[u0].size() - (f0==0?0:1);

for(int i = 0; i < m; i++)

match(tr[0].g[u0][i],tr[1].g[u1][i],u0,u1);

}void solve()

}tr[0].dfs(1,0);

int hsz = *min_element(tr[0].maxsz+1,tr[0].maxsz+1+n);

for(int i = 1; i <= n; i++)

}tr[0].gethash(tr[0].root,0);

ull hax = tr[0].hashval[tr[0].root];

tr[1].dfs(1,0);

for(int i = 1; i <= n; i++)}}

match(tr[0].root,tr[1].root,0,0);

}int main()

hdu2527(哈夫曼樹)

題意 建完樹後,判斷下除了葉子結點之外的其他結點之和是否大於題目給出的數字。思路 如果了解哈夫曼樹,就會知道,它是拿出一串數中兩個權值最小的,合成乙個新的,再將這個新形成的加入到那個串中,再操作.這樣,就可以用優先佇列來模擬建哈夫曼樹的過程,從而ac此題。注意 此題有坑,被它弄wa了2次,就是當它有...

hdu6228 搜尋 類似樹的重心 Tree

這道題其實不是樹的重心,只是乙個搜尋qwq 給定乙個無根樹,問你把樹的任意點染成某個顏色,總共有k個顏色,然後沒個顏色相互連線,把那些連線用的邊搞成乙個集合,總共k個集合,每個集合要求裡面的邊盡可能的小,問你這些集合的最大交集 有多少 思路 以前做過樹的重心,樹的重心滿足一點,就是這個重心去掉之後,...

HDU6567 樹重心模板練習題

傳送門 題意 給你兩棵樹,讓你把這兩顆樹連線起來,要求連線起來的樹的任意兩個節點的距離最小 題解 樹重心模板訓練題,找到這兩顆樹的樹重心,然後連線,最後求一次,樹中所有路徑的長度。ps 因為沒顆樹的節點數是不清楚的,只有找到樹的節點數才能dp找到樹重心,所以要在重心之前dfs一遍找樹大小,這裡也可用...