データ構造(5)-図

データ構造(5)-図


= LUOFANG SHIJIE +オンラインパートナーの意見+個人的な意見

侵入!


「矢面に立つ」

有向グラフでは、頂点は角括弧、無向グラフでは、頂点は括弧

たとえば、<x、y>と<y、x>は同じではありませんが、(x、y)と(y、x)は同じです。

グラフでは、通常、nを使用して頂点の数を表し、eを使用してエッジの数を表します。


無向完全グラフおよび有向完全グラフ:

無向完全グラフ:エッジの数はn(n-1)/ 2です

指示された完全なグラフ:エッジの数はn(n-1)です

ネット:加重グラフはしばしばネットと呼ばれます

インディグリーおよびアウトディグリー:有向グラフ用。有向グラフでは、すべての頂点のインディグリーとアウトディグリーの合計の1/2が、グラフ内のエッジの数です。

パスの長さパス上のエッジの数

接続された、接続されたグラフ、接続されたコンポーネントグラフにはパス接続されたパスがあり、任意の頂点にはパス接続されたグラフがあります

無向グラフの最大接続サブグラフ-接続コンポーネント


強く接続されたグラフと強く接続されたコンポーネント有向グラフと比較して。

接続されたグラフのスパンツリー:グラフ内のすべての頂点を含むが、ツリーを形成するのに十分なn-1個のエッジしかない最小の接続されたサブグラフ。


グラフにn個の頂点があり、n-1未満のエッジがある場合は、切断されたグラフである必要があります。n-1個を超えるエッジがある場合は、リングが必要です。


有向樹木と産卵林:1つの点のみが0度で、他の点が1度である有向グラフは有向樹と呼ばれます。

産卵林:いくつかの有向樹木で構成されており、互いに交差していません


ここに写真の説明を挿入


グラフストレージ構造

隣接行列表記

写真がネットの場合、次のように表現できます。

#define MaxInt 32767
#define MVNum 100
typedef char VerTexType;	//假设顶点的类型是char型
typedef int ArcType;		//假设边的权值类型是int
typedef struct
{
	VerTexType vexs[MVNum];
	ArcTexType arcs[MVNum][MVNum];
	int arcnum,vexnum;
}AMGraph;

隣接行列メソッドを使用して、無向ネットワークを作成します。時間の複雑さ0(n 2

Status CreatUND(AMGraph &G)
{
	cin>>G.arcnum>>G.vexnum;
	for(int i=0;i<vexnum;i++)  //依次输入顶点信息
		cin>>G.vexs[i];
	for(int i=0;i<vexnum;i++)
	{
		for(int j=0;j<vexnum;j++)
		{
			G.arcs[i][j]=MaxInt;
		}
	}
	for(int k=0;k<G.arcnum;k++)
	{
		cin>>v1>>v2>>w;  //输入一条边依附的顶点和权值
  		i=LocateVex(G,v1);
  		j=LocateVex(G,v2);
  		G.arcs[i][j]=w;
  		G.arcs[i][j]=G.arcs[j][i];	//无向网
	}
	return OK;
}

ここに写真の説明を挿入


頂点よりもエッジが少ないグラフの場合、この構造はストレージスペースの大きな浪費になります。したがって、別のストレージ構造を検討します。隣接リスト(隣接リスト)は、配列とリンクリストを組み合わせたストレージ方法です。


隣接リスト表記


ここに写真の説明を挿入


教科書の理解は少し混乱しています


新着:

  1. グラフ内の頂点は1次元配列に格納されます。さらに、頂点配列内のデータ要素ごとに、頂点のエッジ情報を見つけるために、最初の隣接点へのポインタを格納する必要があります。

  2. グラフ内の各頂点viのすべての隣接点は線形テーブルを形成します。隣接点の数が不確実であるため、単一リンクリストに格納されます。無向グラフは頂点viのエッジテーブルと呼ばれ、有向グラフはアークテールとして頂点viと呼ばれます。発信テーブル。


無向グラフの隣接リスト構造。

ここに写真の説明を挿入


有向グラフの場合、隣接リストの構造は類似しています

図に示すように、エッジテーブルを格納するためのアークテールとして頂点を使用すると、各頂点のアウト度を簡単に取得でき、アークヘッドとして頂点を使用するテーブルは、頂点のイン度を簡単に取得できます。つまり、逆隣接テーブルです。

ここに写真の説明を挿入


重みのあるネットワークグラフの場合、エッジテーブルノード定義に重みデータフィールドを追加し、重み情報を格納できます。

ここに写真の説明を挿入


ここに写真の説明を挿入


グラフトラバーサル

2つのトラバーサル方法:

深さ優先検索と幅優先検索

深さの最初の検索

ここに写真の説明を挿入


幅の最初の検索は、ツリートラバーサルに似ています

ここに写真の説明を挿入

幅優先アルゴリズムにはキューが必要です

アルゴリズム分析:幅優先アルゴリズムと深さ優先アルゴリズムは同じ時間の複雑さを持ち、どちらも隣接ノードの検索の複雑さに依存します


グラフアプリケーション

最小スパニングツリー

プリムのアルゴリズム

ここに写真の説明を挿入
ここに写真の説明を挿入


Kruskalアルゴリズム

ここに写真の説明を挿入
ここに写真の説明を挿入

おすすめ

転載: blog.csdn.net/Touale/article/details/112686341