连通图遍历策略之深度优先搜索(C语言)
生活随笔
收集整理的這篇文章主要介紹了
连通图遍历策略之深度优先搜索(C语言)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
深度優先搜素(DFS)
深度優先搜索是一種在開發爬蟲早期使用較多的方法。它的目的是要達到被搜索結構的葉結點(即那些不包含任何超鏈的HTML文件) 。在一個HTML文件中,當一個超鏈被選擇后,被鏈接的HTML文件將執行深度優先搜索,即在搜索其余的超鏈結果之前必須先完整地搜索單獨的一條鏈。其過程簡要來說是對每一個可能的分支路徑深入到不能再深入為止,而且每個節點只能訪問一次。
深度優先搜索類似于樹的前序遍歷
我們依據鄰接表進行遍歷,還需要運用遞歸的思想,這類似于堆棧的遍歷方式。
同樣以如下連通圖為例:
構建其對應的鄰接表:
采用深度優先搜素的遍歷順序如下:
注:藍線劃去的代表該頂點的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语言)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HKEY_LOCAL_MACHINE\S
- 下一篇: js时间比较方法