グラフ理論
白は図であることを言って、グラフ理論、
グラフ理論ではなく、あなたがPythonの亀の絵を使ってみましょう。我々の偉大な先祖は、グラフ理論を発明した場合要するに、何かではなく、今日のマップナビゲーション、テイクアウト、航空機やたくさんのことが幻想であるではありません。
グラフ理論は、その最短経路を研究することです。図に乗り、この数字は、マップを持っている資格がない、↑です。悪役がある場合、あなたは彼の乗り物酔いLEST V1 V5からの最短経路を見つけるために行く必要があるので、彼はv1のv5のバスからやってみたかったが、彼は乗り物酔いになります。
だから、どのように彼はそれをv5はするV1から最短パスを取得することを完全に自動化されたコンピュータの馬鹿はどうですか?これは、例えば、アルゴリズムを解決するために、最短パスアルゴリズムの一部を必要とする:等ダイクストラ、ベルマン・フォードは、最短パスアルゴリズムを計算するために使用されます。
以下は、データのセットです。
5 // 5ポイントの合計と道路5 1 3 2 // チャネル2の量(長さ)が存在する点3から点表す 2 5 1 1 2 1 。4 5 4 2 3 5 // なし有向グラフ
我々は喜んで、コードの戦いの準備をするとき、我々は問題を見つける:どのようにマップを入力するためにコンピュータDOに保存されていますか?
これは非常に「必要で強力なストレージに」アプローチを:隣接行列を!!!
データで見てみましょうが、我々は2次元配列にこの通りを保つことができ、重さ(長さ)との間に3道路にノード1である5があります:
INT グラフ[NUM] [NUM]; int型A、B、C; scanfの(" %のD "、&A、&B、&C); // A、両端点の手前のB、Cは、このエッジであります量(長さ)。 グラフ[A] [B] = C。
グラフノードのj番目の長さ[I] [J]にノードiのアレイを示すグラフです。
注意:もしグラフ[I] [J] = INF、 次にノードiノードにjは無限大を示しています。
コードはそのコードの速度が速くなる演奏、演劇に非常に簡単であるため、隣接行列は、良いことでした。また、私たちは限り、あなたはアクセスしてさらに修正することができるよう、店舗、クエリ、更新、および迅速かつ簡単に他の操作へのその側面を見ることができるコードを読みます。
しかし、彼はまた、いくつかの欠点を持っている:彼のストレージの複雑さ(O(V ^ 2))が高すぎる、まばらなグラフを格納するために使用される場合は、スペースを大幅に無駄になります。:V = 10 000ノード、100メガバイトのためのグラフスペースには、これはグラフ理論の共通の問題を超えている場合には、そう、我々の偉大な祖先はというものを発明隣接リストを!!!(今日は話すことはありません)
最後に、基本的な質問を添付:HDU 2544(acm.hdu.edu.cn)
(隣接行列テンプレートコード:)
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 const int型 INF = 0x3fを。 INTグラフ[ 10000 ] [ 10000 ]。 ボイド Adjacency_Matrix(int型、INT B、int型のC)を { グラフ[A] [B] = C。// 邻接矩阵的精髓 } int型のmain() { int型のn; scanf関数(" %のD "、&N) 以下のために(INT iが= 1 ; I <= N; I ++)のために(INT J = 1。 ; J <= N; J ++)グラフ[I] [J] = INFは; // 前処理、割り当てられた各INF ため(INT I = 1 ; I <= N; I ++ ) { int型A 、B、C; scanfの(" %D%D%D "、&、&B、&C); // エンドポイントの各エッジの入力と重み adjacency_matrix(B、C); // 隣接行列デポジット図 } 用(INT I = 1 ; I <= N; I ++ ) { ため(INT J = 1。 ; J <= N; J ++ ) { IF(!グラフ[I] [J] = INF)// グラフ[I] [j]がINFである場合、電流Iとの間にエッジが存在しない、J のprintf(" %D%D%D \ N- "、I、J、グラフ[I] [J]); / / エンドポイント番号とその順番重み他端側から出力された図隣接行列メモリの機能を示すために 他 続行; } } 戻り 0 ; }
次に、ブロガーはみんなと一緒にチャットしますと、より強く存在は道チャート:隣接テーブルを!!!