深度優先搜索判別以鄰接表方式存儲的有向圖中是否存在由頂點vi到頂點vj的路徑(i≠j)

數據結構文章推薦:
👉 順序表和鏈表實現圖書管理系統
👉 指針如何賦值?關於指針的理解
👉 多種方式實現英文單詞詞頻統計和檢索系統
👉 待更新
內容要求:

試基於圖的深度優先搜索策略寫一個算法,判別以鄰接表方式存儲的有向圖中是否存在由頂點vi到頂點vj的路徑(i≠j)。並請設計程序測試該算法的有效性。

代碼實現(僅供參考):
#include <stdio.h>
#include <stdlib.h>
#define MAXN 100  //最大邊數
typedef struct ArcNode{//弧結點
    int ajdVex;    //弧終點指針位置
    ArcNode* next;     //下一條弧的指針
};
typedef struct Node{//頂點結點
    ArcNode* Arc;     //指向依附該頂點的弧指針
};
typedef struct Graph{//鄰接表
    Node adjlist[MAXN];     //點集
    bool visited[MAXN];     //是否被遍歷
    int n,m;    //頂點數和弧數
};
    Graph *G = (Graph*)malloc(sizeof(Graph));
    int i,j,k;bool hasPath = false;
void createLink(){//創建鄰接表
    printf("請輸入頂點數n 弧數m:");
    scanf("%d %d",&G->n,&G->m);
    printf("創建的所有點:");
    for(i=0;i<G->n;i++){ G->adjlist[i].Arc = 0;printf("V%d ",i);}printf("\n");
    for(j=0;j<G->m;j++){
        printf("第%d條弧起點編號、終點編號:",j+1);
        scanf("%d %d",&i,&k);
        ArcNode *p = (ArcNode*)malloc(sizeof(ArcNode));
        p->ajdVex = k;  //將邊所指向的點編號賦值
        p->next = G->adjlist[i].Arc;
        G->adjlist[i].Arc = p;
    }
}
void print_Graph(){//輸出鄰接表
    ArcNode *p;
    for(i=0;i<G->n;i++){
        p = G->adjlist[i].Arc;
        printf("V%d",i);
        while(p){
            printf("->V%d",p->ajdVex);
            p = p->next;
        }printf("\n");
    }
}
void existPath(int d,int z){//兩點是否連通
    G->visited[d] = true;
    ArcNode *p = G->adjlist[d].Arc;
    if(d == z)hasPath = true;
    while(p){
        if(p->ajdVex==z)hasPath = true;
        if(!G->visited[p->ajdVex])existPath(p->ajdVex,z);
        p = p->next;
    }
}
void print_Path(int d,int z){//輸出兩點連接路徑
    ArcNode *p = G->adjlist[d].Arc;
    printf("路徑爲:V%d",d);
    while(p){
        printf("->V%d",p->ajdVex);
        if(p->ajdVex == z)break;
        p = G->adjlist[p->ajdVex].Arc;
    }printf("\n");
}
void setFlase(){//visited置零
    hasPath = false;
    for(i=0;i<G->n;i++) G->visited[i] = false;
}
int main(){
    createLink();
    while(true){printf("\n");
        printf("請輸入操作(1.打印信息 2.判斷路徑 3.退出):");
        int choice; scanf("%d",&choice);setFlase();
        if(choice == 1) print_Graph();
        if(choice == 2){
            printf("請輸入兩點編號:"); scanf("%d %d",&i,&k);existPath(i,k);
            if(hasPath){printf("兩點連通!\n");print_Path(i,k);} 
            else printf("兩點不連通!\n");
        }
        if(choice == 3)break;
    }
    return 0;
}
實現效果:效果圖

這個問題專門考察了我們對深度優先搜索的使用熟練程度,同時也加深了我們對圖的操作。
最後,如果有問題的話歡迎交流!有幫助的話別忘了支持一下哦 👍👍👍

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章