題目鏈結
你拿到了一棵樹,請你給每個頂點染成紅色或藍色。
要求:每個紅點周圍有且僅有乙個紅點,每個藍點周圍有且僅有乙個藍點。
「周圍」的定義:某點周圍的點指通過鄰邊直接連線的點。
所謂樹,即沒有自環、重邊和迴路的無向連通圖。
第一行乙個正整數 n
nn,代表樹的頂點個數。(1≤
n≤100000
)(1 \leq n \leq 100000)
(1≤n≤1
0000
0)接下來的 n−1
n-1n−
1 行,每行兩個正整數 u
uu 和 v
vv,代表點 u
uu 和點 v
vv 有一條邊連線。 (1≤
u,v≤
n)(1 \leq u,v \leq n)
(1≤u,v
≤n)保證輸入的一定是一棵合法的樹。
如果可以達成染色的要求,請輸出乙個長度為 n
nn 的字串,第 i
ii 個字元代表第 i
ii 個頂點的染色情況,『b』 代表藍色,『r』 代表紅色。(若有多種合法染色的方法,輸出任意一種即可)
否則直接輸出 −1-1
−1。
4
1 22 3
3 4
rrbb
4
1 21 3
1 4
-1
題解寫得有點複雜,我換種思路,採取自底向上染色的方法,對乙個葉子結點來說,顯然它只能和其父親同色,我們就給其一對相同的編號,若遍歷一遍樹剛好能拆成偶數對,證明可以染色,那再遍歷一遍染色即可,編號過程如下圖:
若在編號過程中發現某一結點的父親已經染色,證明其父親已和其他結點組成一對,那麼這個結點必無法染色,則直接輸出 −1-1
−1即可,ac**如下:
#include
typedef
long
long ll;
using
namespace std;
const
int n =
1e5+5;
vector<
int> g[n]
;int n, x, y, cnt, id[n]
=, ans[n]
;void
dfs1
(int son,
int father)if(
!id[son]
) id[father]
= id[son]
=++cnt;}}
void
dfs2
(int son,
int father,
int color)
}int
main()
dfs1(1
,0);
dfs2(1
,0,0
);for(
int i =
1; i <= n; i++
)putchar
(ans[i]
?'r'
:'b');
return0;
}
2021牛客寒假演算法基礎集訓營3
三場牛客下來覺得自己越來越不在狀態,思路不清晰,一下手就是bug,每調完一題刷下榜都被甩開十里地,罰時慘不忍睹 傳送門 簽到 include using namespace std typedef long long ll const ll inf 0x3f3f3f3f const ll mod 1...
2021牛客寒假演算法基礎集訓營1
題目描述 請你構造乙個非空的括號字串,包含正好 k 個不同合法括號對。所謂括號字串,是指由 和 這兩種字元構成的字串。要求構造的字串長度不超過100000。輸入描述 乙個整數 k。乙個整數 kk。0 k 1e9 輸出描述 乙個僅包含左右括號字串,其中有 kk 個合法的括號對。如果有多種構造方法,輸出...
2021牛客寒假演算法基礎集訓營6
思路 k1排k2前面滿足 k1.a k2.ax k2.b k1.b k1.ax k1.b k2.b k2.ak1.b k2.b k1.a k2.a k1.b include define ull unsigned long long define ll long long const int inf...