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,每兩個數之間有乙個空格,最後乙個數後面沒有空格。
23 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
?#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統計的單詞,乙個空行代...