時間限制:2000ms
單點時限:1000ms
記憶體限制:256mb
給定2個樹a和b,保證a的節點個數》=b的節點個數。
現在你需要對樹a的邊進行二染色。
乙個好的染色方案,指不存在乙個樹a中的連通塊,同時滿足以下2個條件
1. 其中只有同色的邊
2. 和b同構。兩個樹同構是指,存在乙個一一對映(既是單射又是滿射),將樹b的各節點對映到不同的樹a的節點,使得原來在樹b中相鄰的點,在對映後,仍相鄰。
問是否存在一種好的染色方案。
第一行乙個整數t (1<=t<=10),表示資料組數。
接下來是t組輸入資料,測試資料之間沒有空行。
每組資料格式如下:
第一行乙個整數n ,表示樹a的節點總數。
接下來n-1行,每行2個數a, b (1 <= a, b <= n)表示樹a的節點a和b之間有一條邊。
接下來一行,乙個整數m(1 <= m <= n),表示樹b的節點總數。
接下來m-1行,每行2個數a, b (1 <= a, b <= m)表示樹b的節點a和b之間有一條邊。
對每組資料,先輸出「case x: 」,x表示是第幾組資料,然後接「yes」/「no」,表示是否存在所求的染色方案。
小資料:1 <= n <= 20
大資料:1 <= n <= 1000000
無論如何染色,只要從a中挑一條邊就行了。
樣例輸入
1樣例輸出31 2
2 32
1 2
case 1: no這樣。如果樹b的任意結構的深度超過2,那麼,交叉染色能在a中避免b的出現。 否則當b的深度不超過2,即是兩層的樹,那麼,只要當a中存在一點,它的度數為t1m>=t2m*2-1,就能得到與b相同染色的塊。
#include #include #include #include using namespace std;const int n=1000010;
int t1[n],t2[n];
int main()
} return 0;
}
程式設計之美2015測試賽 題目1 同構
給定2個樹a和b,保證a的節點個數 b的節點個數。現在你需要對樹a的邊進行二染色。乙個好的染色方案,指不存在乙個樹a中的連通塊,同時滿足以下2個條件 1.其中只有同色的邊 2.和b同構。兩個樹同構是指,存在乙個一一對映 既是單射又是滿射 將樹b的各節點對映到不同的樹a的節點,使得原來在樹b中相鄰的點...
BJOI2015 樹的同構
bzoj 4337 傳送門 這道題很顯然是樹的雜湊裸題。有根樹的雜湊很簡單,把子節點雜湊值搞一搞 有各種搞法 就變成了本節點雜湊值。再用map存一下就ok了。但是這道題是無根樹,怎麼選乙個根開始深搜計算雜湊值呢?可以使用樹的重心。每棵樹最多有兩個重心,至少有乙個重心。我們新建乙個節點0。如果只有乙個...
4337 BJOI2015 樹的同構
題解 樹的同構的判定 有根樹從根開始進行樹hash 先把兒子的f進行排序 f i sum num i 我沒有仔細想這樣是不是樹是唯一的。反正過了 無根樹先找到重心再作為根 因為重心最多只有兩個,複雜度仍舊o n include using namespace std define rint regi...