日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

连通图遍历策略之深度优先搜索(C语言)

發布時間:2025/3/15 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 连通图遍历策略之深度优先搜索(C语言) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

深度優先搜素(DFS)

深度優先搜索是一種在開發爬蟲早期使用較多的方法。它的目的是要達到被搜索結構的葉結點(即那些不包含任何超鏈的HTML文件) 。在一個HTML文件中,當一個超鏈被選擇后,被鏈接的HTML文件將執行深度優先搜索,即在搜索其余的超鏈結果之前必須先完整地搜索單獨的一條鏈。其過程簡要來說是對每一個可能的分支路徑深入到不能再深入為止,而且每個節點只能訪問一次。

深度優先搜索類似于樹的前序遍歷
我們依據鄰接表進行遍歷,還需要運用遞歸的思想,這類似于堆棧的遍歷方式。

同樣以如下連通圖為例:

構建其對應的鄰接表:

采用深度優先搜素的遍歷順序如下:






注:藍線劃去的代表該頂點的visit[i]=1,無需多次遍歷。

深度優先搜索步驟:

  • 從某一頂點出發進行訪問,該點首先被讀入,visit[i]置為1
  • 依次訪問該點的一個鄰接點
  • 若該鄰接點還有臨界,那么訪問該鄰接點的一個鄰接點;若沒有,則返回上一步進行搜索
  • * 深度優先搜索函數代碼:*

    void DFS(AdjMatrix *G, int v) {EdgeNode *p;printf("->%c",G->adjlist[v].vertex);visited[v]=1;p=G->adjlist[v].edgenext;while (p){ if(!visited[p->adjvex]) DFS(G,p->adjvex);p=p->next;} } //從第v個頂點出發DFSvoid DFSTraverse(AdjMatrix *G) {printf("廣度優先搜索順序");for(int v=0;v<G->n;++v)visited[v]=0;for(int v=0;v<G->n;++v)if(!visited[v]) DFS(G,v);//遞歸調用printf("\n\n"); }

    具體代碼如下:

    #include <stdio.h> #include <stdlib.h> #define MaxVertices 100 #define MAX_VERTEX_NUM 10 typedef struct node{ //邊表 int adjvex;node* next; }EdgeNode; typedef struct{ //頂點表 int vertex; EdgeNode* edgenext; }VertexNode; typedef VertexNode AdjList[MaxVertices]; typedef struct{ AdjList adjlist; int n,e; }AdjMatrix; int visited[MAX_VERTEX_NUM]; void CreateGraph(AdjMatrix* G) { int i,j,k,w,v; EdgeNode *s; printf("輸入頂點數和邊數(中間以空格分開):"); scanf("%d%d",&G->n,&G->e); printf("建立頂點表\n"); for (i=0;i<G->n;i++) { //fflush(stdin); //如果 stream 指向輸入流(如 stdin),那么 fflush 函數的行為是不確定的。//故而使用 fflush(stdin) 是不正確的。getchar(); printf("請輸入第%d個頂點的信息:",i+1);G->adjlist[i].vertex=getchar();G->adjlist[i].edgenext=NULL; } //前插法 printf("建立邊表\n"); for (k=0;k<G->e;k++) { printf("輸入有連接的頂點序號:"); scanf("%d%d",&i,&j); //對于直接相連的進行編入(即對輸入“0 1”時,在0對應的邊表中編入1) i-=1;j-=1; s=(EdgeNode*)malloc(sizeof(EdgeNode)); s->adjvex=j;//邊表賦值 s->next=G->adjlist[i].edgenext; G->adjlist[i].edgenext=s; //對于間接相連的進行編入(即對輸入“0 1”時,在1對應的邊表中編入0)s=(EdgeNode*)malloc(sizeof(EdgeNode)); s->adjvex=i; s->next=G->adjlist[j].edgenext; G->adjlist[j].edgenext=s; } } void DispGraph(AdjMatrix *G) {int i;for (i=0;i<G->n;i++) { printf("%d->",i+1); while(1) { if(G->adjlist[i].edgenext==NULL){printf("^");break; }printf("%d->",G->adjlist[i].edgenext->adjvex+1); G->adjlist[i].edgenext=G->adjlist[i].edgenext->next; } printf("\n"); } } void DFS(AdjMatrix *G, int v) {EdgeNode *p;printf("->%c",G->adjlist[v].vertex);visited[v]=1;p=G->adjlist[v].edgenext;while (p){ if(!visited[p->adjvex]) DFS(G,p->adjvex);p=p->next;} } //從第v個頂點出發DFS void DFSTraverse(AdjMatrix *G) {printf("廣度優先搜索順序");for(int v=0;v<G->n;++v)visited[v]=0;for(int v=0;v<G->n;++v)if(!visited[v]) DFS(G,v);//遞歸調用printf("\n\n"); }//DFSTraverse int main() { freopen("1.txt","r",stdin);AdjMatrix* G= (AdjMatrix*)malloc(sizeof(AdjMatrix)); CreateGraph(G); DFSTraverse(G); DispGraph(G); }

    測試數據如下:
    注:由于測試輸入數據較多,程序可以采用文件輸入

    5 7
    1
    2
    3
    4
    5
    1 2
    1 3
    1 4
    2 3
    2 4
    3 5
    4 5

    總結

    以上是生活随笔為你收集整理的连通图遍历策略之深度优先搜索(C语言)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。