资格赛:题目1:同构
描述
給定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. 兩棵樹 A?, B?;?node(A)?>= node(B) ;對 A 二染色,與 B 同構部分不能只有一種顏色。
2.問題轉化為:對 A?二染色,顏色相同的部分不能與 B 同構。
3. 舉例:
??????????????????
????????????????????????????????????? A????????????????????????????????————————————>???????? B’
??????????????????????????????????????????????????????????????????????????由 A 得出最大邊同色樹
其中,A 的根結點的度最大為?5 , 則它連接的邊必定有 3 條相同(無論如何染色)。而那些與根節點不相關的邊,可以任意染色。
若 B 是 B’ 的子樹,則答案是 "NO";否則,答案是 "YES"。
由此圖,得出樣例輸入 && 輸出:
1
12
1 2
1 3
……
5 12
4
1 2
1 3
1 4
Case 1: NO
4:解題思路:在樹 A 中,找出度最大(設為 D)的節點,進而求出樹 B’?(1個根節點,(D+1)/2 個葉節點,深度為 1);
??????????????????判斷 B?是否是 B’?的子樹,若是,則? "NO",否?? 則?"YES"。?
code:
?
1 #include<stdio.h> 2 #include<memory.h> 3 const int MAX = 1e+6 +1; 4 int d1[MAX]; 5 int d2[MAX]; 6 int main(){ 7 int T, M, N; 8 scanf("%d",&T); 9 for(int k = 0; k < T; ++k){ 10 memset(d1, 0, sizeof(d1)); 11 memset(d2, 0, sizeof(d2)); 12 int v1, v2; 13 scanf("%d", &N); 14 for(int i = 1; i < N; ++i){ 15 scanf("%d%d", &v1, &v2); 16 ++d1[v1]; ++d1[v2]; 17 } 18 scanf("%d", &M); 19 for(int i = 1; i < M; ++i){ 20 scanf("%d%d", &v1, &v2); 21 ++d2[v1]; ++d2[v2]; 22 } 23 int D = 0, Mleaf = 0; 24 for(int i = 1; i <= N; ++i){ 25 if(d1[i] > D) D = d1[i]; 26 if(d2[i] == 1) ++Mleaf; 27 } 28 if(M < 3) --Mleaf; // remove root Node 29 if(Mleaf == M - 1 && Mleaf <= (D + 1) / 2) 30 printf("Case %d: NO\n", k+1); 31 else printf("Case %d: YES\n", k+1); 32 } 33 return 0; 34 }?
?
?
轉載于:https://www.cnblogs.com/liyangguang1988/p/3664434.html
總結
以上是生活随笔為你收集整理的资格赛:题目1:同构的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Mono for Android 篇二
- 下一篇: Netty writeAndFlush(