ストレージ構造
記憶された図の隣接行列の//二次元配列 //設定点とエッジ量、INT、N、E、W INT G [101] [101]; ボイドmake1(){ CIN N - >>; のための(INT I = 。1; I <= N; I ++){ (INT 1 = Jため; J <= N - 、= J +)G [I] [J] = 0x7FFFFFFFで; } //初期化 CIN >> E; INT X、Y。 (INT I = 1; I <= E; I ++){ため CIN Y >> >> W X; G [X] [Y] = W; G [Y] [X] = W; //これは無向グラフので、これが二つ } } //隣接テーブル 構造体ノード{ からINTに、DIS、 ノード(A int型、INT B、INT C){ から= A; B =であり; DIS = C; } }; ベクター<ノード> ADJ [MAXN]; //アナログ隣接テーブルの配列 //最初のプロ名------星の鎖 構造体{エッジ 次INT; //一連の数字に するint型; //場所のこちら側 INTのDIS; //量側 }エッジ[1001]; //これは、エッジである INTヘッド[101]、num_edge; // これはノードである ボイドadd_edge(INTからのINTのint DIS){// 追加一方向からの距離からDIS側へへ! エッジ[num_edge] .TO =に、 エッジ[num_edge] = .DIS DIS、 エッジ[num_edge ++] = [から] .nextヘッドと 【から】ヘッド= num_edge; } (){ボイドmake2 CIN >> N-> > E; num_edge = 0; int値X、Y、D、 のために(INT I = 1; I <= E; I ++){ CIN Y >> >> X D、 add_edge部材(X、Y、D); } 以下のために(INT I =ヘッド[1]; I 0 ;!エッジIを= = [I] .next){ //トラバーサル } } int型のmain(){ 戻り0; }
トラバースグラフ
BFS、DFS
主要コンセプト:
深さ優先スパニングツリー
フォールバック側
ボイドDFSS(int型のx、int型depht ){// ベルト層(隣接リスト版) VIS [X] = 1; のための(INT I = 1; I <ADJ = [X] .size(); I ++){ ADJ J = INT [X] [I]; IF(VIS [J])DFS(J ,. 1つの+深さ); //接続を判断する必要がない } } //幅優先 構造体ノード{ int型のV; //頂点IDの INT層; //レイヤ番号 }、 ベクトル<ノード> AJD [MAXN]; ボイドbfsss(Xはint、int型層){ ノードが起動; start.v = X; //数開始 start.layer = 0、 キュー<ノード> Q; q.push(スタート); VIS [X] = 1; ながら(!q.empty()){ ノードq.front = NOW(); q.pop(); INT = U now.v ; のための(INT I = 1; I <AJD [U] .size(); I ++){ ノードADJ J = [U] [I]; //接続された頂点 j.layer = now.layer + 1; IF(VIS [JV] == 0){ q.push(J); VIS [JV] = 1; } } } } //全体図のトラバース 1回だけ横断//もし図ユニコム、 {ボイドtravdfs() のための(INT I = 1; <= N-I; I ++){ IF(VIS [I] == 0)DFS(I); } } ボイドtravbfs(){ (INT I = 1。 I <= N; I ++){ IF(VIS [I] == 0)BFS(I ,. 1); //層の数 }
例:オイラーの道(オイラー路)、オイラー
図は、図中の点から、全体の始動を横切ると、1つによって各側面によって。
パスまたはオイラーオイラーがあるかどうかをまず、
DFS又は互いに素セット:(1)グラフ図を接続してください
(2)無向グラフ:点は全ての偶数次のとおりオイラーの存在
オイラー道路の存在、開始点として、エンドポイント:2つの特異点があります。
(3)有向グラフ:マークの各点の顕著度が-1であること、浸透+の程度、
オイラー図の存在:1、他は0であり、唯一度(原点)、1(エンドポイント)の程度であります
第二に、出力オイラー:
背面のDFS、印刷または書き込みを再帰的な、しかし、データが大きい場合、非再帰的なフォームを持っています。
第三に、混合火Oulaループ問題:最大流量
http://ybt.ssoier.cn:8088/problem_show.php?pid=1341
N-INT、E; INT回路[101]、D [101] [101]、C [101]; Cは、オイラー経路又はオイラー決定するために使用される度に//各点 のint NUMと、 ボイド検索(INT I){ ため(INT J = 1; J <= N; J ++){ IF(D [I] [J] == 1){ D [I] [J] = D [J] [I] = 0; //このエッジ削除 、検索(J) } } //パスを記録し、回路[NUM ++] = I } これは0オイラー(奇数、オイラー経路(特異点2)である//をポイント) INTメイン(){ CIN >> N-E; INT X、Y、 のmemset(C、0、はsizeof(C)) のmemset(D、0、はsizeof(D)) 。(INT I = 1 ; I <= E; I ++){ CIN >> Y X、 D [X] [Y] = D [Y] [X] = 1; C [X] ++; C [Y] ++; } 開始1 = INT; のために(INT I = 1; I <= N; I ++){ IF(C [I] == 2%1)を開始= I; //特異点を開始 } NUM = 0; (スタート)を見つけます。 以下のために(INT iが= 1; I <= NUM; I ++)COUT <<回路[I] <<」「。 coutの<<てendl; 0を返します。 }
ハミルトンリング:すべての点を通る非反復、およびループ
//ハミルトンリング:全ての点を通って繰り返し、回路ではない //リングのすべて見つけることができる visted VI [1001]、INTを、[1001]、NUM [1001]、G [1001] [1001]; int型長さ; INT ANS [1001]; //回答保存 INT N-、M、X、 ボイドプリント(){ 用(INT I = 1; I <長さ、I ++)COUT << ANS [I] << ""; COUT ANS << [長さ] << ENDL; } ボイドDFS(INT最後、I int型){//最後にアクセス-最後に、私はこの時間 visted [I] = 1; VI [I] = 1; //タグ。 用(INT J = 1; J <[I] = NUM; J ++){ IF(G [I] [J] == X && G [I] [J] =最終!){ ANS [++長さ] = J。 プリント(); //ループ出力を見つける length--; BREAK; } (!visted [G [I] [J])IF DFS(I、G [I] [J]); //すべてのトラバースI関連ドット } length--。 visted [I] = 0;//バック標識されていないVI []、VIは、図に現れとしてかどうかを示します。 } メインINT(){ memsetの(visted、0、はsizeof(visted)); のmemset(VI、0、はsizeof(VI)); CIN >> N-M; ; INT Y (INT I = 1; I <= M; I ++){ CIN Y >> X; G [X] [++ NUM [X] = Y; G [Y] [++ NUM [Y] = X; } (X = 1。 X <= N; X ++){ !IF(VI [X]){ 長さ= 0; DFS(0、X); } //横断する出発点として、各点ではない任意の一点は環を通過することができるので } 戻り0; }
最短パス
ダイクストラ