1. 程式人生 > >C語言利用圖的鄰接矩陣的儲存方式實現有向圖和無向圖的深度優先搜尋(DFS)

C語言利用圖的鄰接矩陣的儲存方式實現有向圖和無向圖的深度優先搜尋(DFS)

C語言利用圖的鄰接矩陣的儲存方式實現有向圖和無向圖的深度優先搜尋(DFS)

Description

圖採用鄰接矩陣儲存,圖中頂點數為n(0<n<20),頂點資訊為整數,依次為0,1,..,n-1。

編寫函式,輸入圖的型別,0:無向圖,1:有向圖;輸入圖的頂點數、邊數、邊的偶對,建立鄰接矩陣;

編寫函式,實現圖的深度優先搜尋,輸出深度優先搜尋序列。

呼叫上述函式,從0號頂點出發,輸出圖的深度優先搜尋序列,以空格分隔。

Input

第1行:圖的型別 ( 0:無向圖,1:有向圖)

第2行:圖的頂點數,邊數

第3行開始,每行一個邊的偶對,如vi,vj

Output

以空格分隔的深度優先遍歷序列

Sample Input

1
6,8
0,1
0,2
0,3
2,1
2,4
3,4
5,3
5,4

Sample Output

0 1 2 4 3 5 

HINT

 

首先定義一個結構體,鄰接矩陣還是很直觀的一個二維陣列構成的矩陣

#include <stdio.h>
#include <stdlib.h>
#define Max_Vetex_Num 100
typedef struct {
    int vexs[Max_Vetex_Num];
    int arcs[Max_Vetex_Num][Max_Vetex_Num];
    int vexnum,arcnum;
}Mgraph;

vexs儲存的是這個圖的頂點資訊,可以使char的字元,這裡是int型別。

定義完成結構體之後,進行這個鄰接矩陣的建立:

相較於之前的鄰接表的建立方式,鄰接矩陣就顯得單純的多。

二維陣列而已,若是有向圖,將關聯的<i,j>這兩個頂點對應的第i行,第j個元素置1即可;若是無向圖,則麻煩一點,第i行,第j個元素置1,第j行,第i個元素也置1。

下面就是鄰接矩陣的建立的程式碼,分別是定位(檢測存在?),建立鄰接矩陣,以及隨手寫的一個輸出函式。

/*找到指定數字在矩陣中的位置*/
int LocateVex(Mgraph *G,int u){
    int i;
    for(i=0;i<G->vexnum;i++)
    {
        if(G->vexs[i]==u)
            return i;
        else
            return -1;
    }
}

void CreateMGraph(Mgraph *G){
    int type;
    int i,j,k,w;
    int v1,v2;
    scanf("%d",&type);
    if(type==0)
    {
        scanf("%d,%d",&(G->vexnum),&(G->arcnum));
        //自動構造頂點資訊為index
        for(i=0;i<G->vexnum;i++)
        {
            G->vexs[i]=i;
        }
        //初始化鄰接矩陣,全部為0
        for(i=0;i<G->vexnum;i++){
            for(j=0;j<G->vexnum;j++){
                G->arcs[i][j]=0;
            }
        }

        //輸入每行一個邊的偶對,如v1,v2
        for(k=0;k<G->arcnum;k++)
        {
            scanf("%d,%d",&v1,&v2);
            i = LocateVex(G,v1);
            j = LocateVex(G,v2);

            G->arcs[v1][v2]=1;
            G->arcs[v2][v1]=1;
        }
    }else{
        scanf("%d,%d",&(G->vexnum),&(G->arcnum));
        //自動構造頂點資訊為index
        for(i=0;i<G->vexnum;i++)
        {
            G->vexs[i]=i;
        }
        //初始化鄰接矩陣,全部為0
        for(i=0;i<G->vexnum;i++){
            for(j=0;j<G->vexnum;j++){
                G->arcs[i][j]=0;
            }
        }

        //輸入每行一個邊的偶對,如v1,v2
        for(k=0;k<G->arcnum;k++)
        {
            scanf("%d,%d",&v1,&v2);

            G->arcs[v1][v2]=1;

        }
    }
    //PrintVex(G);
}

void PrintVex(Mgraph *G)
{
    int i,j;
    for(i=0;i<G->vexnum;i++){
        for(j=0;j<G->vexnum;j++)
        {
            printf("%d ",G->arcs[i][j]);
        }
        printf("\n");
    }
}

#type這個int型變數是用來標識有向圖和無向圖的;

最後貼一個main函式的程式碼,呼叫以下以上的函式即可;

int main()
{
    Mgraph G;
    CreateMGraph(&G);
    DFSTraverse(&G);
    //printf("Hello world!\n");
    return 0;
}

 

全部程式碼如下

#include <stdio.h>
#include <stdlib.h>
#define Max_Vetex_Num 100
typedef struct {
    int vexs[Max_Vetex_Num];
    int arcs[Max_Vetex_Num][Max_Vetex_Num];
    int vexnum,arcnum;
}Mgraph;

void DFSTraverse(Mgraph *G)
{
    int v;
    int i;
    int visited[G->vexnum];
    for(i =0;i<G->vexnum;i++)
    {
        visited[i]=0;
    }
    for(i =0;i<G->vexnum;i++)
    {
        if(visited[i]==0)
            DFS(G,i,visited);
    }
}

void DFS(Mgraph *G,int v,int visited[]){
    int w;
    int zf = 0;
    visited[v]=1;
    printf("%d ",v);
    int i;
    for(i=0;i<G->vexnum;i++)
    {
        if(visited[i]==0&&G->arcs[v][i]==1)
            DFS(G,i,visited);
    }

}

/*找到指定數字在矩陣中的位置*/
int LocateVex(Mgraph *G,int u){
    int i;
    for(i=0;i<G->vexnum;i++)
    {
        if(G->vexs[i]==u)
            return i;
        else
            return -1;
    }
}

void CreateMGraph(Mgraph *G){
    int type;
    int i,j,k,w;
    int v1,v2;
    scanf("%d",&type);
    if(type==0)
    {
        scanf("%d,%d",&(G->vexnum),&(G->arcnum));
        //自動構造頂點資訊為index
        for(i=0;i<G->vexnum;i++)
        {
            G->vexs[i]=i;
        }
        //初始化鄰接矩陣,全部為0
        for(i=0;i<G->vexnum;i++){
            for(j=0;j<G->vexnum;j++){
                G->arcs[i][j]=0;
            }
        }

        //輸入每行一個邊的偶對,如v1,v2
        for(k=0;k<G->arcnum;k++)
        {
            scanf("%d,%d",&v1,&v2);
            i = LocateVex(G,v1);
            j = LocateVex(G,v2);

            G->arcs[v1][v2]=1;
            G->arcs[v2][v1]=1;
        }
    }else{
        scanf("%d,%d",&(G->vexnum),&(G->arcnum));
        //自動構造頂點資訊為index
        for(i=0;i<G->vexnum;i++)
        {
            G->vexs[i]=i;
        }
        //初始化鄰接矩陣,全部為0
        for(i=0;i<G->vexnum;i++){
            for(j=0;j<G->vexnum;j++){
                G->arcs[i][j]=0;
            }
        }

        //輸入每行一個邊的偶對,如v1,v2
        for(k=0;k<G->arcnum;k++)
        {
            scanf("%d,%d",&v1,&v2);

            G->arcs[v1][v2]=1;

        }
    }
    //PrintVex(G);
}

void PrintVex(Mgraph *G)
{
    int i,j;
    for(i=0;i<G->vexnum;i++){
        for(j=0;j<G->vexnum;j++)
        {
            printf("%d ",G->arcs[i][j]);
        }
        printf("\n");
    }
}
int main()
{
    Mgraph G;
    CreateMGraph(&G);
    DFSTraverse(&G);
    //printf("Hello world!\n");
    return 0;
}