diff --git a/graph/README.md b/graph/README.md deleted file mode 100644 index 9e64d6a3..00000000 --- a/graph/README.md +++ /dev/null @@ -1,10 +0,0 @@ -# General Graph Algorithms - -Algorithms for trees are not here. - -## Lowlinkについて - -- Articulation points (関節点) - - その一点を消去するとグラフが連結でなくなるような頂点 -- Bridge (橋) - - その一辺を消去するとグラフが連結でなくなるような辺 diff --git a/graph/bipartite_matching(slow).hpp b/graph/bipartite_matching(slow).hpp deleted file mode 100644 index d26045d2..00000000 --- a/graph/bipartite_matching(slow).hpp +++ /dev/null @@ -1,52 +0,0 @@ -#pragma once -#include -#include - -// CUT begin -// Bipartite matching of undirected bipartite graph -// -// Comprexity: O(VE) -struct BipartiteMatching { - int V; // # of vertices - std::vector> edges; // Adjacency list - std::vector match; // match[i] = (Partner of i'th node) or -1 (No parter) - std::vector used; - int timestamp; - BipartiteMatching(int V = 0) : V(V), edges(V), match(V, -1), used(V, 0), timestamp(0) {} - - void add_edge(int u, int v) { - edges[u].push_back(v); - edges[v].push_back(u); - } - - bool dfs(int v) { - used[v] = timestamp; - for (auto to : edges[v]) { - if (match[to] < 0 or (used[match[to]] != timestamp and dfs(match[to]))) { - match[v] = to; - match[to] = v; - return true; - } - } - return false; - } - - int solve() // Count up newly formed pairs - { - int ret = 0; - for (int v = 0; v < V; v++) - if (match[v] < 0) { - ++timestamp; - ret += dfs(v); - } - return ret; - } - - friend std::ostream &operator<<(std::ostream &os, const BipartiteMatching &bm) { - os << "{V=" << bm.V << ":"; - for (int i = 0; i < bm.V; i++) - if (i < bm.match[i]) { os << "(" << i << "-" << bm.match[i] << "),"; } - os << "}"; - return os; - } -}; diff --git a/graph/bipartite_matching.hpp b/graph/bipartite_matching.hpp index c64eb92a..0f93b5a8 100644 --- a/graph/bipartite_matching.hpp +++ b/graph/bipartite_matching.hpp @@ -5,13 +5,13 @@ // Bipartite matching of undirected bipartite graph (Hopcroft-Karp) // https://ei1333.github.io/luzhiled/snippets/graph/hopcroft-karp.html -// Comprexity: O((V + E)sqrtV) +// Complexity: O((V + E)sqrtV) // int solve(): enumerate maximum number of matching / return -1 (if graph is not bipartite) struct BipartiteMatching { int V; std::vector> to; // Adjacency list std::vector dist; // dist[i] = (Distance from i'th node) - std::vector match; // match[i] = (Partner of i'th node) or -1 (No parter) + std::vector match; // match[i] = (Partner of i'th node) or -1 (No partner) std::vector used, vv; std::vector color; // color of each node(checking bipartition): 0/1/-1(not determined) diff --git a/graph/enumerate_cliques.md b/graph/enumerate_cliques.md index 2b568d49..fe42df9b 100644 --- a/graph/enumerate_cliques.md +++ b/graph/enumerate_cliques.md @@ -18,7 +18,7 @@ for (auto [u, v] : edges) { vector> cliques; auto op = [&](const vector &clique) { - // `clique` is NOT guranteed to be sorted + // `clique` is NOT guaranteed to be sorted cliques.push_back(clique); }; diff --git a/number/dyadic_rational.md b/number/dyadic_rational.md index ed5e2277..c120cffd 100644 --- a/number/dyadic_rational.md +++ b/number/dyadic_rational.md @@ -1,9 +1,11 @@ --- -title: Dyadic rational, surreal number (二進分数・固定小数点数,Conway の構成) +title: Dyadic rational number (2進有理数) documentation_of: ./dyadic_rational.hpp --- -分母が二冪の有理数 `DyadicRational` の実装,また超現実数の構成法に基づく $\\{ l \mid r \\}$ の計算.組合せゲーム理論などへの応用がある. +2進有理数 (dyadic rational number) の実装 `DyadicRational` ,また 2進有理数 $l, r$ によって定まる区間 $[l, r]$ に対する最簡数 (simplest number) $\\{ l \mid r \\}$ の計算. + +2進有理数はその名の通り分母が二冪の有理数である.プログラミングコンテストでは組合せゲーム理論での応用例がある. `Int` が整数部分を表すための符号付整数型で `int` や `long long` の利用を想定,`Uint` が小数部分を表すための符号なし整数型で `unsigned` や `unsigned long long` の利用を想定(`__uint128_t` も動くかもしれない).メンバ変数 `integ`, `frac` がそれぞれ整数部分と小数部分に対応し, @@ -14,6 +16,18 @@ $ がこのクラスのインスタンスが表す有理数 $x$ である. 実装の制約上分母のオーダーは(`Uint = unsigned long long` の場合)$2^{63}$ が上限となる. +## 組合せゲームの2進有理数による評価 + +以下のすべての条件を満たす非不偏ゲーム (partizan game) は2進有理数を用いて局面の評価が可能. + +- 有限個の手 +- 有限で終了 +- 「必ず先手が勝つ」(帰結類が $\mathscr{N}$)局面が存在しない + +ゲームが DAG として表される場合,各局面の評価値を「その局面から先手が指した任意の局面の評価値の最大値と後手が指した任意の局面の評価値の最小値」の最簡数として再帰的に定める.この評価関数は直感的には先手の優勢度を示している. + +複数の局面の直和に対する評価値は,各局面の評価値の和となる. + ## 使用方法 ### `DyadicRational(Int x)` @@ -22,28 +36,31 @@ $ ### `double to_double()` -インスタンスが表す有理数 $x$ を `double` 型に変換. +インスタンスが表す2進有理数を `double` 型の浮動小数点数に変換. ### `DyadicRational right()` -[Surreal number (超現実数)の構成過程を表す木](https://en.wikipedia.org/wiki/Surreal_number#/media/File:Surreal_number_tree.svg) において,現在の値 $x$ の右側の子の値を返す. +インスタンスが表す2進有理数について, [Surreal number (超現実数)の構成過程を表す木](https://en.wikipedia.org/wiki/Surreal_number#/media/File:Surreal_number_tree.svg) における右の子の値を返す. ### `DyadicRational left()` -`right()` とは逆に,現在の値 $x$ の左側の子の値を返す. +`right()` とは逆に,現在の値の左側の子の値を返す. ### `DyadicRational DyadicRational::surreal(DyadicRational l, DyadicRational r)` -$l < r$ を満たす二進分数 $l$, $r$ について,$l < x < r$ を満たし surreal number の構成過程を表す木で根($0$)に最も近い要素(Conway の記法に基づくと $\\{ l \mid r \\}$)の値を返す.$l < r$ を満たさない場合 runtime error となる. +$l < r$ を満たす二進分数 $l$, $r$ の最簡数 $\\{ l \mid r \\}$ ,すなわち $l < x < r$ を満たし surreal number の構成過程を表す木で根($0$)に最も近い要素の値を返す.$l < r$ を満たさない場合 runtime error となる. 現在は根から一歩ずつ `right()` または `left()` で探索していく実装になっているが,場合分けと bit 演算を頑張れば $O(1)$ になると思われる. ## 問題例 -- [AtCoder Beginner Contest 229 H - Advance or Eat](https://atcoder.jp/contests/abc229/tasks/abc229_h) +- [AOJ 1377: Black and White Boxes](https://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=1377) Blue-Red Hackenbush を含む. +- [技術室奥プログラミングコンテスト#6 Day1 P - Game on Colored Tree](https://atcoder.jp/contests/tkppc6-1/tasks/tkppc6_1_p) Blue-Red Hackenbush そのもの. +- [AtCoder Beginner Contest 229 H - Advance or Eat](https://atcoder.jp/contests/abc229/tasks/abc229_h) 帰結類 $\mathscr{N}$ に属する局面が存在しないゲームのため,2進有理数による解析が可能. -### リンク +### 参考文献・リンク +- 安福・坂井・末續『組合せゲーム理論の世界: 数学で解き明かす必勝法』共立出版 2024. - [組合せゲーム理論入門(1)](http://www.ivis.co.jp/text/20111102.pdf) 組合せゲーム理論の観点からの解説. - [解説 - NECプログラミングコンテスト2021(AtCoder Beginner Contest 229)](https://atcoder.jp/contests/abc229/editorial/2977) 非不偏ゲーム(Partisan Game)の問題例とその解き方. - [提出 #27486895 - NECプログラミングコンテスト2021(AtCoder Beginner Contest 229)](https://atcoder.jp/contests/abc229/submissions/27486895) Nyaan さんの実装.