隣接行列で表現される無向グラフの深度トラバーサルの実装

隣接行列で表現される無向グラフの深度トラバーサルの実装

C言語

隣接行列で表現される無向グラフの実現

1. 隣接行列構造を定義する

#define VerType int //定义顶点信息的类型
#define MVNum 10 //定义数组的最大长度
typedef int ArcType; //假设边的权值类型为整型
//定义邻接矩阵结构
typedef struct{
    
    
    //定义顶点表
    VerType vexs[MVNum];
    //定义邻接矩阵的边关系
    ArcType arcs[MVNum][MVNum];
    //定义顶点、弧/边的数量
    int vexnum,arcnum;
}AMGraph;

2. 隣接行列を作成する関数

隣接行列表記法、アルゴリズムのアイデアを使用した無向ネットワークの作成

  • 頂点の合計数とエッジの合計数を入力します
  • 入力された点の情報は頂点テーブルに順次格納されます
    ※各重みが0になるように隣接行列を初期化します
  • 隣接行列を構築する

隣接行列の空間計算量は O(n^2) です

//创建邻接矩阵
void CreateUND(AMGraph *G){
    
    
    //输入顶点数和边数
    printf("please input the vexnum and arcnum:\n");
    scanf("%d %d",&(G->vexnum),&(G->arcnum));
    //初始化顶点表
    printf("please input the info of vexs matrix:\n");
    for (int i = 0; i < G->vexnum; i++)
    {
    
    
        scanf("%d",&(G->vexs[i]));
    }
    //初始化邻接矩阵
    for (int i = 0; i < G->vexnum; i++)
    {
    
    
        for (int j = 0; j < G->vexnum; j++)
        {
    
    
            G->arcs[i][j]= 0;//边的权值均为0
        }
    }

    //根据边/弧赋值矩阵
    for (int k = 0; k < G->arcnum; k++)
    {
    
       
        // 一条边所依附的两个点
        //输入点和权值
        VerType v1,v2;
        int w;
        printf("please input the value of point v1 and point v2 and w:\n");
        scanf("%d %d %d",&v1,&v2,&w);
        
        //找寻这两个点的下标
        int i = LocateG(*G,v1);
        int j = LocateG(*G,v2);

        if ((i!=-1) && (j!=-1))
        {
    
    
            G->arcs[i][j] = w;
            G->arcs[j][i] = w;
        } 
    }
}

//定位元素下标位置的函数
int LocateG(AMGraph p,VerType v){
    
    
    for (int i = 0; i < p.vexnum; i++)
    {
    
    
        if(p.vexs[i]==v) return i;
    }
    return -1;
}

3. 深度トラバース

方法

  • グラフの特定の開始点 v を訪問した後、v から開始して、その重要な頂点 w1 を訪問します。
  • w1 から開始して、w1 に隣接しているがまだ訪問されていない頂点 w2 を訪問します。
  • 次に、w2 から同様の訪問を実行します。
  • これは、隣接するすべてのポイントが訪問されるまで続きます。
  • 次に、一歩下がって、直前に訪問した頂点に戻って再度開始し、上記と同様の訪問を実行します。
  • そうでない場合は、一歩下がって検索してください。接続されたグラフ内のすべての頂点にアクセスするまで、上記のプロセスを繰り返します。
void DFS(AMGraph G,int v,int visited[]){
    
    
    //访问第v+1个顶点,1<= v+1 <=vexnum
    visited[v] = 1;
    printf("%d\t",G.vexs[v]);//输出访问顶点的值
    //依次检查邻接矩阵v所在的行
    for (int w = 0; w < G.vexnum; w++)
    {
    
    
        if ((G.arcs[v][w]!=0) && (visited[w]==0))
        {
    
    
            DFS(G,w,visited);
        }
    }
}

4. テストを実行する

int main(){
    
    
    AMGraph G;
    AMGraph *p = &G;

    //创建邻接矩阵
    CreateUND(p);

    //输出邻接矩阵
    printf("\t");
    for (int i = 0; i < G.vexnum; i++)  printf("%d\t",i+1);
    printf("\n");
    for (int i = 0; i < G.vexnum; i++)
    {
    
       
        printf("%d\t",i+1);
        for (int j = 0; j <G.vexnum; j++)
        {
    
    
            printf("%d\t",G.arcs[i][j]);
        }
        printf("\n");
    }
    //深度优先遍历图
    //声明并初始化数组visited
    int visited[G.vexnum];
    for (int i = 0; i < G.vexnum; i++)
    {
    
    
        visited[i] = 0;
    }
    //输入起始点在顶点表中的下标0<=k<vexnum
    printf("please input the index of initial point:\n");
    int k;
    scanf("%d",&k);
    DFS(G,k,visited);
    
    return 0;
}

作成するグラフは図のとおりであり、
ここに画像の説明を挿入
演算の入出力結果は以下のとおりです。

おすすめ

転載: blog.csdn.net/weixin_44848852/article/details/119649675