洛谷 P1971 兔兔與蛋蛋遊戲 題解

2022-10-10 17:27:11 字數 2151 閱讀 3303

二分圖博弈模板題鏈結

首先這題有個並不顯然的性質:我們發現,同乙個格仔不能經過兩次。

簡單證明:

如果我們走回這個格仔,那麼路徑顯然成乙個環。我們把這個環拿出來,因為是網格圖上的環,我們容易發現其周長必然是偶數。

如果現在格仔裡填的是黑棋子,那麼經過偶數步我們當前必然只能走白格仔,反之亦然(自己畫圖理解一下)。

有了這個性質,這題就成了二分圖博弈模板題:有兩類點,每次只能從一類點向另一類點走,無法移動的人失敗。

二分圖博弈經典結論:起點是二分圖最大匹配必經點則先手必勝,否則先手必敗。

題目告訴我們:兔兔犯錯誤當且僅當這次操作過後,必勝方由兔兔變成了蛋蛋。

於是我們只要判斷所有操作過後的局面是先手必勝還是先手必敗即可。如果兔兔操作前是先手必勝局面,操作後還是先手必勝局面(此時先手是蛋蛋),則兔兔犯錯誤。

判斷乙個局面是否先手必勝,也即判斷當前點是否是二分圖最大匹配必經點,首先要把之前操作過的點刪掉(不能走第二遍),記錄當前最大匹配,然後刪掉當前點,看最大匹配是否減小即可。

聽起來太麻煩了?我們有乙個小 trick!

對於這種刪掉點的,我們通常考慮把時間軸倒過來,讓時間倒流。這樣就把刪點的操作變成了加點。

於是我們把操作的點按時間倒序加入。每次加入乙個點後如果最大匹配變大,那麼這個點是必經點,當前局面是先手必勝局面。

為什麼加入點後最大匹配變大就是必經點?考慮反證法,如果不是,說明有乙個最大匹配不經過該點,那麼沒有該點的最大匹配應該等於有該點的最大匹配,與加入點後最大匹配變大矛盾。

#include #include #include #include #include #include using i64 = long long;

const int n = 1e4 + 10, m = 1e5 + 10;

int gox = ;

int goy = ;

bool vis[50][50], win[n];

char g[50][50];

int n, m, k, s = n - 1, t = n - 2;

int idx = 1, head[n], nex[m], to[m], fl[m];

std::vector< std::pair> del ;

void addedge(int u, int v, int f)

void addflow(int u, int v, int f)

namespace dinic

} return 0;

} int dfs(int u, int flow)

return flow - rest;

} int main(void) }

inline int getid(int x, int y)

int main(void)

if (g[i][j] == 'x')

addflow(s, getid(i, j), 1);

if (g[i][j] == 'o')

addflow(getid(i, j), t, 1);

} }std::cin >> k;

for (int i = 1, x, y; i <= k << 1; ++i)

for (int i = 1; i <= n; ++i)

for (int j = 1; j <= m; ++j)

if (!vis[i][j] && g[i][j] == 'x')

for (int k = 0; k < 4; ++k)

dinic::main();

int tmp = 0;

for (int i = k << 1; i >= 0; --i)

} win[i] = dinic::main();

} int res = 0;

for (int i = 0; i <= k << 1; i += 2)

if (win[i] && win[i + 1])

++res;

std::cout << res << '\n';

for (int i = 0; i <= k << 1; i += 2)

if (win[i] && win[i + 1])

std::cout << (i >> 1) + 1 << '\n';

return 0;

}

NOI2011 洛谷 兔兔與蛋蛋遊戲

初見安 這裡是傳送門 洛谷p1971 noi2011 兔兔與蛋蛋遊戲 這種題啊 就只能多悟,才能看到了就知道怎麼做 bushi。看題目的操作 每次交替移動黑白棋子。然後就可以想到二分圖了 什麼鬼。空白格仔從初始到終點走的路徑上的格仔都是與之交換過的,並且黑白相間,該路徑與以前走過的路徑不可能有交點。...

NOI 兔兔與蛋蛋的遊戲

二維的乙個最大匹配 program game type rec record x,y longint end const numm rec x 0 y 0 dx array 1.4 of integer 0,1,0,1 dy array 1.4 of integer 1,0,1,0 var link...

NOI2011 兔兔與蛋蛋遊戲

傳送門 直接博弈論dfs可以得到75分 然鵝我博弈論學的很pie include define ll long long define inf 10000 using namespace std intread while s 0 s 9 return x f char s 45 int lr ud...