1900 985的「樹」難題

2021-07-16 12:16:35 字數 1814 閱讀 1118

time limit: 1 sec  

memory limit: 128 mb

985給你一棵「樹」以及它的根節點,要求你先判定它是否是一棵樹,其次他想知道每個節點的「太子」數目以及它的父親(root的話輸出自己)。

「太子判定條件」:

一、若x是y的孩子節點,那麼x是y的「太子」;

二、若x是y的「太子」且y是z的「太子」,那麼x是z的「太子」。

第一行輸入乙個整數t,代表有t組測試資料。

每組資料第一行輸入兩個整數n,root分別代表樹的節點數目以及根節點的編號。

接下來n-1行,每行輸出兩個整數u,v代表u節點和v節點之間有一條樹邊。

注:1 <= t <= 20,1 <= n <= 1e4,1 <= root <= n,1 <= u,v <= n。

對每一組資料,若給定的「樹」不合法輸出no即可,反之輸出yes,接下來輸出佔兩行:

第一行輸出n個整數代表每個節點的「太子」數目,

第二行輸出n個整數代表每個節點的父親節點編號。

輸出順序從1到n,每兩個數之間有乙個空格,最後乙個數後面沒有空格。

2

3 11 2

2 32 1

1 1

yes

2 1 0

1 1 2

no

-.-證明我不適合比賽的一題

宇神稱之為簽到題

事實上涉及到了一些知識點也不複雜

dfs、並查集、鄰接表

dfs用來遞迴查詢下一節點

並查集用來更新節點的深度和父節點的資訊

鄰接表用來優化資料結構

1、讀取輸入存入鄰接表

2、以root為起點dfs下一節點

3、以並查集思想把下一節點的父節點設為這一節點

最後用find函式來更新根的深度

[cpp]view plain

copy

print

?#include

#include

inthead[10200];  

intheadcnt;  

bool

win;  

struct

list  edge[20200];  

intn,root;  

intpar[10200];  

intran[10200];  

intflag[10200];  

intfind(

intm)   

}  void

unite(

intx,

inty)   

void

dfs(

intu)   

}  }  

void

add(

intu,

intv)   

intmain()   

for(

inti=1; i

intu,v;  

scanf("%d %d"

,&u,&v);  

add(u,v);  

add(v,u);  

}  win=true

;  flag[root]=1;  

dfs(root);  

if(win)   

}  if

(win)   

for(

inti=1; i<=n; i++)   

} else

printf("no\n"

);  

}  return

0;  

}  

G 樹的難題

時間限制 10000 ms 空間限制 165536 kb 評測說明 1s,128m 問題描述 給出乙個無根樹。樹有n個點,邊有權值。每個點都有顏色,是黑色 白色 灰色這三種顏色之一,稱為一棵三色樹。可愛的alice覺得,乙個三色樹為均衡的,當且僅當,樹中不含有黑色結點或者含有至多乙個白色節點。然而,...

字典樹 統計難題

描述 ignatius最近遇到乙個難題,老師交給他很多單詞 只有小寫字母組成,不會有重複的單詞出現,現在老師要他統計出以某個字串為字首的單詞數量 單詞本身也是自己的字首 輸入輸入資料的第一部分是一張單詞表 不超過15000個 每行乙個單詞,單詞的長度不超過10,它們代表的是老師交給ignatius統...

字典樹 統計難題

ignatius最近遇到乙個難題,老師交給他很多單詞 只有小寫字母組成,不會有重複的單詞出現 現在老師要他統計出以某個字串為字首的單詞數量 單詞本身也是自己的字首 input輸入資料的第一部分是一張單詞表,每行乙個單詞,單詞的長度不超過10,它們代表的是老師交給ignatius統計的單詞,乙個空行代...