1. 程式人生 > >牛客網 小白月賽2 F題 黑黑白白 【簡單sg博弈】

牛客網 小白月賽2 F題 黑黑白白 【簡單sg博弈】

傳送門
題意: 就是每次在一顆有根樹上有一個棋子, 兩個人輪流的移動棋子, 且每次只能向其兒子移動, 不能移動者輸掉比賽, 給定這個樹的形態, 問是否先手必勝.

思路: 稍微瞭解一點sg博弈的都知道, 這就是sg博弈的最開始的引入呀, 就是在一副有向圖上進行移動棋子, 不能移動者輸掉, 所以我們直接引用sg博弈的含義. 對於sg[x] = 0的點表示該點是必輸態, 那麼能移動到必輸狀態的點就是必贏態, 反過來也成立, 即可以移動到必贏態的就是必輸態. 所以這棵樹的所有的葉子節點就是必輸態, 那麼根據這個性質可以直接遞迴的處理下即可, 具體細節請看程式碼.

AC Code

const int
maxn = 1e5+5; vector<int>g[maxn]; int sg[maxn]; void dfs(int u, int fa) { sg[u] = 0; for (int i = 0 ; i < sz(g[u]) ; i ++) { int to = g[u][i]; if (to == fa) continue; dfs(to, u); if (!sg[to]) sg[u] = 1; } } void solve() { int n, r; cin >> n >> r; for
(int i = 1 ; i < n ; i ++) { int u, v; cin >> u >> v; g[u].pb(v); g[v].pb(u); } dfs(r, -1); printf("%s\n", sg[r]?"Gen":"Dui"); for (int i = 1 ; i <= n ; i ++) g[i].clear(); }