サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
デスク環境を整える
dai1741.github.io
最小全域木(クラスカル法とUnionFind) 今回は無向グラフの最小全域木について説明します。 最小全域木を用いる問題はICPCでもたまに出題されます(今年のアジア地区予選東京大会F問題とか)。 最小全域木とは 無向連結グラフの全域木は、グラフが連結であるという条件を保ったまま辺を消去して得られる木のことです。 最小全域木は、全域木を構成する辺のコストの総和が最小となるもののことを指します。 最小全域木問題は、与えられたグラフの最小全域木またはそのコストを求める問題です。 次の図は最小全域木の例です。赤い辺が最小全域木を構成します。 赤い辺以外を消去するとグラフは全域木になり、また少し考えるとこれよりコストの和が小さい全域木が存在しないことがわかります。 最小全域木問題の解法 最小全域木は グラフの辺を、 コストが小さい順に、 閉路を作らないように採用していく という貪欲法で求められます
C++(ソートの補足) 複数の要素をまとめてソート 複数の要素をまとめてソートしたいときは、pairの配列(vector<pair<型1, 型2> >)を使うと簡単にできる。 #include <stdio.h> #include <vector> #include <algorithm> // sort #include <map> // pair using namespace std; int main() { int n = 10; vector<pair<int, int> > pairs(n); for (int i = 0; i < n; i++) { pairs[i] = make_pair(i*i % 10, i); } // firstが小さい順、secondが小さい順にソート sort(pairs.begin(), pairs.end()); for (int i =
動的計画法(ナップサック問題) 動的計画法とナップサック問題について解説します。 動的計画法とは 直接計算すると大きな時間がかかってしまう問題に対し、途中の計算結果をうまく再利用することで計算効率を上げる手法のこと。 「途中の計算結果を再利用」=「同じ計算をしない」ということ 難しいように見えて考え方自体は単純 ICPC国内予選でもC問題~F問題くらいに何かしらの形で2,3題ほどでます 英語では「Dynamic Programming」と呼び、略して「DP」と呼ぶことが多いです。 動的計画法で効率的に解ける問題の一つに、ナップサック問題というものがあります。 ナップサック問題 ナップサック問題は、価値と重さが決まっている複数の品物を容量が一定のナップサックに詰め込むとき、ナップサックに詰め込める品物の価値の和の最大値は何であるか? という問題です。 具体的には、以下の図のようになります。ナ
構文解析 再帰下降構文解析 構文解析にはいろいろな手法がありますが、プログラミングコンテストでは実装が単純かつそこそこ強力な(LL(1)文法を処理できる)再帰下降構文解析がよく使われます。 これは、関数の再帰を使って構文を小さな領域に分割していき、末端から値を確定させていく手法です。 四則演算の構文解析 例として、四則演算の構文解析を考えます。 ここでは四則演算は数字と括弧、+-*/の4つの演算子から成り立っているとします。演算子の優先順位も実際の四則演算の通り、掛け算と割り算が優先されます。ただし、全ての演算は整数だとします。以下は式の一例です。 まずは、四則演算の構文をBNF記法で表します。 BNF記法をあまり厳格に記述する必要はありませんが、演算子の優先順位はきっちり判別できるようにしておく必要があります。 最初に、式全体をexprという変数(非終端記号)で表すとします。 exprの
講習会資料 GitHub Pagesとjekyllで資料を作ってみた。 今後もこの形式で資料を用意するかは未定。今後資料を作るのかも未定。 目次 完全な目次はサークルWikiのページにあります。 C++ C++(標準ライブラリの紹介) C++(ソートの補足) 最短経路問題(ベルマンフォード法・ワーシャルフロイド法) 動的計画法(ナップサック問題) 幾何 構文解析 二分探索 最小全域木(クラスカル法とUnionFind)
最短経路問題 ベルマンフォード法とワーシャルフロイド法について解説します。 ダイクストラ法と比べて構造が単純(プライオリティキューがいらない)なので、多少は理解しやすいと思います。 入力の形式について このページで使用しているサンプルコードの標準入力は、全て下記の形式で与えられます。 n m $$[f_1 \ t_1 \ c_1]$$ $$[f_2 \ t_2 \ c_2]$$ ... $$[f_m \ t_m \ c_m]$$ nは頂点数、mは辺の数を示し、続くm行の \([f\_i, t\_i, c\_i]\) はそれぞれi番目の辺の始点、終点、重みを示します。 ベルマンフォード法 ベルマンフォード法は、2点間の最短路を見つけるアルゴリズム。 ダイクストラ法はうまく頂点を選ぶことで効率を上げているが、ベルマンフォード法では全ての辺に対して距離が短くなる経路があるか判定する。 基本的には
このページを最初にブックマークしてみませんか?
『dai1741.github.io』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く