定義: node
(維基百科:https://en.wikipedia.org/wiki/Depth-first_search)算法
深度優先搜索算法(Depth-First-Search),是搜索算法的一種。是沿着樹的深度遍歷樹的節點,儘量深的搜索樹的分支。當節點v的全部邊都己被探尋過,搜索將回溯到發現節點v的那條邊的起始節點。這一過程一直進行到已發現從源節點可達的全部節點爲止。若是還存在未被發現的節點,則選擇其中一個做爲源節點並重復以上過程,整個進程反覆進行直到全部節點都被訪問爲止(屬於盲目搜索)。數組
基本思想:ide
(1)訪問頂點v;oop
(2)從v的未被訪問的鄰接點中選取一個頂點w,從w出發進行深度優先遍歷;this
(3)重複上述兩步,直至圖中全部和v有路徑相通的頂點都被訪問到。spa
算法複雜度:code
如有v個頂點、E條邊,則blog
用鄰接表儲存圖,有O(V+E)遞歸
用鄰接矩陣儲存圖,有O(V^2)
僞代碼:
遞歸實現:
(1)訪問頂點v;visited[v]=1;//算法執行前visited[n]=0
(2)w=頂點v的第一個鄰接點;
(3)while(w存在)
if(w未被訪問)
從頂點w出發遞歸執行該算法;
w=頂點v的下一個鄰接點;
//布爾型數組Visited[]初始化成false void DFS(Vetex v) { Visited[v] = true; for each w adjacent to v if (!Visited[w]) DFS(w); }
非遞歸實現:
(1)棧S初始化;visited[n]=0;
(2)訪問頂點v;visited[v]=1;頂點v入棧S
(3)while(棧S非空)
x=棧S的頂元素(不出棧);
if(存在並找到未被訪問的x的鄰接點w)
訪問w;visited[w]=1;
w進棧;
else
x出棧;
//布爾型數組Visited[]初始化成false void DFS(Vertex v) { Visited[v] = true; Stack sta = MakeStack(MAX_SIZE); Push(sta, v); while (!Empty(sta)) { Vertex w = Pop(sta); for each u adjacent to w { if (!Visited[u]) { Push(sta, u); Visited[u] = true; } } } }
附:用C語言寫一個走迷宮
1 #include <stdio.h> 2 3 char map[50][51]; //地圖上限50*50 4 int sign[50][50]; //標記 5 int next[4][2]={{0,1},{1,0},{0,-1},{-1,0}}; 6 int n,m; //實際地圖行數、列數 7 int endy,endx; //終點位置 8 int min=99999999; 9 10 /* run this program using the console pauser or add your own getch, system("pause") or input loop */ 11 12 //構造一個盞來記錄走迷宮的路徑 13 struct Node 14 { 15 int y; 16 int x; 17 }; 18 19 struct Stack 20 { 21 Node * pbase; 22 int top; 23 }; 24 25 void StackInit(Stack * pstack){ 26 pstack->pbase=new Node[100]; 27 pstack->top=0; 28 } 29 30 void StackPush(Stack * pstack,int y,int x){ 31 Node node; 32 node.y=y; 33 node.x=x; 34 pstack->pbase[pstack->top]=node; 35 ++pstack->top; 36 } 37 38 void StackCopy(Stack * pstack1,Stack * pstack2){ 39 pstack2->top=pstack1->top; 40 for(int i=0;i<pstack2->top;i++) 41 { 42 pstack2->pbase[i]=pstack1->pbase[i]; 43 } 44 } 45 46 void StackPop(Stack * pstack){ 47 --pstack->top; 48 } 49 50 Stack stack; 51 Stack minstack; 52 53 //深度優先搜索 54 void dfs(int y,int x,int step){ 55 int ty,tx; 56 if(y==endy&&x==endx) 57 { 58 if(step<min) 59 { 60 StackCopy(&stack,&minstack); 61 min=step; 62 } 63 return; 64 } 65 66 for(int i=0;i<4;i++) 67 { 68 ty=y+next[i][0]; 69 tx=x+next[i][1]; 70 if(ty>=0&&ty<n&&tx>=0&&tx<m&&map[ty][tx]!='#'&&sign[ty][tx]==0) 71 { 72 StackPush(&stack,ty,tx); 73 sign[ty][tx]=1; 74 dfs(ty,tx,step+1); 75 StackPop(&stack); 76 sign[ty][tx]=0; 77 } 78 } 79 return; 80 } 81 82 int main(int argc, char** argv) { 83 printf("請輸入行數和列數:"); 84 scanf("%d%d",&n,&m); 85 printf("請建立地圖:\n"); 86 for(int i=0;i<n;i++) 87 { 88 scanf("%s",&map[i]); 89 } 90 printf("建立的地圖以下:\n"); 91 for(int i=0;i<n;i++) 92 { 93 printf("%s\n",map[i]); 94 } 95 printf("請輸入起點(y,x):"); 96 int starty,startx; 97 scanf("%d%d",&starty,&startx); 98 printf("請輸入終點(y,x):"); 99 scanf("%d%d",&endy,&endx); 100 sign[starty][startx]=1; 101 102 StackInit(&stack); 103 StackInit(&minstack); 104 105 dfs(starty,startx,0); 106 printf("最短路程爲%d\n",min); 107 108 printf("最短路徑爲:\n"); 109 map[starty][startx]='s'; //用字符's'表示起點 110 for(int i=0;i<minstack.top;i++) 111 { 112 map[minstack.pbase[i].y][minstack.pbase[i].x]='>'; 113 } 114 for(int i=0;i<n;i++) 115 { 116 printf("%s\n",map[i]); 117 } 118 return 0; 119 }