程式設計之美2015測試賽 題目1 同構

2022-05-05 22:12:14 字數 1457 閱讀 6381

給定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」,表示是否存在所求的染色方案。

演算法分析:這是一道好題呀。首先,如果樹a的深度超過1的話,我們可以對樹a進行交叉染色,這樣就避免了同時滿足以上那兩個條件了;那麼如果樹a和樹b深度都是1的時候呢(即乙個根節點連著n-1個葉節點),這時候如果樹b的葉節點個數小於等於(樹a的葉節點個數+1)/2,就一定存在樹a和樹b同構且所有邊同色的情況。

1 #include2 #include3 #include4 #include5 #include6 #include7

#define inf 0x7fffffff

8using

namespace

std;

9const

int maxn=1000000+10;10

11int

n,m;

12int

du1[maxn],du2[maxn],cnt1,cnt2;

1314

intmain()

1532 scanf("

%d",&m);

33for (int i=1 ;i)

3439

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

4043

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

4448

if (maxdu2==1) cnt2--;

49if (maxdu2<=(maxdu1+1)/2 && cnt2==m-1 && maxdu2==m-1

)50 printf("

case %d: no\n

",ncase++);

51else printf("

case %d: yes\n

",ncase++);52}

53return0;

54 }

程式設計之美2015資格賽

時間限制 2000ms 單點時限 1000ms 記憶體限制 256mb 給定兩個日期,計算這兩個日期之間有多少個2月29日 包括起始日期 1.年份能被4整除但不能被100整除 2.年份能被400整除 第一行為乙個整數t,表示資料組數。之後每組資料報含兩行。每一行格式為 month day,year ...

程式設計之美2015資格賽 題目1 2月29日

時間限制 2000ms 單點時限 1000ms 記憶體限制 256mb 描述 給定兩個日期,計算這兩個日期之間有多少個2月29日 包括起始日期 年份能被4整除但不能被100整除 年份能被400整除 輸入 第一行為乙個整數t,表示資料組數。之後每組資料報含兩行。每一行格式為 month day,yea...

程式設計之美2015初賽A

時間限制 2000ms 單點時限 1000ms 記憶體限制 256mb 兩個數a和 b a第一行為乙個數t,為資料組數。之後每組資料報含兩行。第一行為n,為集合s的大小。第二行為n個整數,表示集合內的數。對於每組資料輸出一行,形如 case x y x為資料編號,從1開始,y為最大的子集的大小。1 ...