1. グラフの概念
グラフ: 有限の空ではない頂点のセットと頂点間のエッジのセットで構成されます。
頂点: グラフ内のデータ要素。
エッジ (エッジ): 頂点間の論理関係。エッジは有向または無向で、重みを持つこともできます (距離、コストなどを表すことができます) 無向エッジ: 頂点間のエッジに方向がない場合、このエッジをエッジと呼び
ます無向エッジ
と有向エッジ: 頂点 vi から νj までのエッジに方向がある場合、このエッジは有向エッジと呼ばれます (無向エッジは 2 つの有向エッジで表すことができます)
無向グラフ
グラフ内の任意の 2 つの頂点間のエッジは無向エッジです。これは、ノード 1 からノード 2、またはノード 2 からノード 1 へのエッジを意味します。
有向グラフ
グラフ内の任意の 2 つの頂点間のエッジは方向を持っています。グラフ内の方向は 1 つの方向を向いています。すべての有向グラフが 1 つの方向を向いているわけではありません。これは便宜上のものです。有向グラフは、次のパスを持つパスとして理解できます。方向、方向、矢印の方向のみ
2. 画像の保存
グラフの保存に一般的に使用される隣接行列と隣接
リストは、保存とクエリが簡単で便利です。欠点は、遭遇したグラフが疎グラフの場合、多くのスペースが無駄になることです。隣接リストは隣接行列よりも複雑です
。 . その利点は明らかではありません
隣接行列
配列 (i, j) は、i から j まで接続されているかどうかを示します。0 は接続されていないことを意味し、0 以外は接続されていることを意味します
無向グラフストレージ
有向エッジを 2 つの有向エッジに変換します。たとえば、頂点 1 と頂点 2 の無向エッジを、頂点 1 から頂点 2 および頂点 2 から頂点 1 への 2 つの有向エッジに変換します。
有向グラフストレージ
隣接リスト
//顶点
class POS{
public POS(int head) {
this.head = head;
}
public int head;//这个值指向的是边
}
//边
class Edge{
public int v;
public int next;
}
//图的初始化
top =0;//用来记录边的位置
posList =new ArrayList<>();//顶点
edgeList =new ArrayList<>();//边的列表
for(int i = 0;i<=posSize;i++){
posList.add(new POS(-1));//初始化
hadVisted[i] =false;//初始化
}
//添加边邻接表,添加一条从u到v的边
public void Add_Edge(int u, int v) {
// 1 -> 4->3->2
Edge edge =new Edge();
edge.v =v;
edge.next =posList.get(u).head;
posList.get(u).head =top;
edgeList.add(edge);
top++;
}
3. 画像検索
深い検索
ディープ検索は再帰 1、頂点 1 からトラバース、頂点 2 までトラバース、次に頂点 2 から 2 をトラバース、頂点 2 から頂点5 までトラバース、頂点 5 から頂点 8 までトラバースします。
3. 頂点 8 へのパスはありません。頂点 5 にバックトラックし、次に頂点 2 にバックトラックし、頂点 6 を横断し、頂点 6 から頂点 7 に横断します。 4、頂点 8 を横断し、6 にバックトラックし、次に 2 にバックトラックし、その後1 5 にバックトラックし、頂点 3、4 をトラバースします
//深搜
public void dfsVist(int u){
for(int i = posList.get(u).head;i!=-1;i=edgeList.get(i).next){
Edge edge = edgeList.get(i);
if(!hadVisted[edge.v]){
System.out.println("访问节点:"+edge.v);
hadVisted[edge.v] =true;
vist(edge.v);
}
}
}
広範囲の検索
Guangsou には、1 に接続されている 2、3、4 を 1 からのキューに追加するのに役立つキューが必要です。同時に、1 がデキューされてキューの先頭から頂点 2 が取り出され、頂点 2 に接続されている 5 と 6 がキューに追加されます。 2 がキューに追加され、2 がデキューされて 3 が取り出され、3 に接続されているすべてが訪問され、4、3、4 が取り出され、7 がキューに入力されて 5 が取り出され、5 に接続されている 8 が取り出されます。キューに追加され、5 がデキューされ、6、7、8 が取り出されます。それらはすべて訪問されているためです。リストが空になると、トラバーサルは終了します。
public void bfsVist(int u){
Queue queue = new LinkedList();
queue.add(u);//加入队列
System.out.println("访问节点="+u);
while (!queue.isEmpty()){//直至列表为空
Integer p = (Integer) queue.poll();//取出列表里元素
for(int i = posList.get(p).head;i!=-1;i=edgeList.get(i).next){
Edge edge = edgeList.get(i);
if(!hadVisted[edge.v]){
hadVisted[edge.v] =true;
System.out.println("访问节点="+edge.v);
queue.add((Integer)edge.v);
}
}
}
}
- 終わり -
Qi Wu 劇団について
Qi Wu Troupe は 360 グループ最大のフロントエンド チームであり、グループを代表して W3C および ECMA メンバー (TC39) の活動に参加しています。Qi Wu Troupe は人材育成を非常に重視しており、エンジニア、講師、翻訳者、ビジネス インターフェース担当者、チーム リーダーなど従業員が選択できるさまざまな育成方向性があり、対応する技術研修、専門研修、一般研修、およびリーダーシップ研修を提供することで補完されています。 . もちろん。Qi Dance Troupe は、あらゆる種類の優れた才能に注目し、オープンで才能を求める姿勢で Qi Dance Troupe に参加することを歓迎します。