牛客網 小白月賽2 F題 黑黑白白 【簡單sg博弈】
阿新 • • 發佈:2019-01-24
傳送門
題意: 就是每次在一顆有根樹上有一個棋子, 兩個人輪流的移動棋子, 且每次只能向其兒子移動, 不能移動者輸掉比賽, 給定這個樹的形態, 問是否先手必勝.
思路: 稍微瞭解一點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();
}