日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

资格赛:题目1:同构

發(fā)布時間:2023/12/2 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 资格赛:题目1:同构 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
時間限制:2000ms 單點時限:1000ms 內存限制:256MB

描述

給定2個樹A和B,保證A的節(jié)點個數(shù)>=B的節(jié)點個數(shù)。

現(xiàn)在你需要對樹A的邊進行二染色。

一個好的染色方案,指不存在一個樹A中的連通塊,同時滿足以下2個條件

1. 其中只有同色的邊

2. 和B同構。兩個樹同構是指,存在一個一一映射(既是單射又是滿射),將樹B的各節(jié)點映射到不同的樹A的節(jié)點,使得原來在樹B中相鄰的點,在映射后,仍相鄰。

問是否存在一種好的染色方案。

?

輸入

第一行一個整數(shù)T (1<=T<=10),表示數(shù)據(jù)組數(shù)。

接下來是T組輸入數(shù)據(jù),測試數(shù)據(jù)之間沒有空行。

?

每組數(shù)據(jù)格式如下:

第一行一個整數(shù)N ,表示樹A的節(jié)點總數(shù)。

接下來N-1行,每行2個數(shù)a, b (1 <= a, b <= N)表示樹A的節(jié)點a和b之間有一條邊。

接下來一行,一個整數(shù)M(1 <= M <= N),表示樹B的節(jié)點總數(shù)。

接下來M-1行,每行2個數(shù)a, b (1 <= a, b <= M)表示樹B的節(jié)點a和b之間有一條邊。

?

輸出

對每組數(shù)據(jù),先輸出“Case x: ”,x表示是第幾組數(shù)據(jù),然后接“YES”/“NO”,表示是否存在所求的染色方案。

?

數(shù)據(jù)范圍

小數(shù)據(jù):1 <= N <= 20

大數(shù)據(jù):1 <= N <= 1000000

?

樣例解釋

無論如何染色,只要從A中挑一條邊就行了。

?

樣例輸入
1 3 1 2 2 3 2 1 2
樣例輸出
Case 1: NO

題目解析:

1. 兩棵樹 A?, B?;?node(A)?>= node(B) ;對 A 二染色,與 B 同構部分不能只有一種顏色。

2.問題轉化為:對 A?二染色,顏色相同的部分不能與 B 同構。

3. 舉例:

??????????????????

????????????????????????????????????? A????????????????????????????????————————————>???????? B’

??????????????????????????????????????????????????????????????????????????由 A 得出最大邊同色樹

其中,A 的根結點的度最大為?5 , 則它連接的邊必定有 3 條相同(無論如何染色)。而那些與根節(jié)點不相關的邊,可以任意染色。

若 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)的節(jié)點,進而求出樹 B’?(1個根節(jié)點,(D+1)/2 個葉節(jié)點,深度為 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:同构的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。