フィギュアレビュー

ストレージ構造

記憶された図の隣接行列の//二次元配列
//設定点とエッジ量、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; 
}

  

最短パス

ダイクストラ

おすすめ

転載: www.cnblogs.com/shirlybaby/p/12370182.html