2)DFS
深度优先搜索总是对最近发现的节点v的出发边进行搜索,直到该节点的所有出发边都被发现
一旦节点v的所有出发边都被发现,搜索回溯到v的前驱结点进行
实现细节:时间戳
每一个结点有一个发现时间和完成时间
DFS后原图的前驱子图构成一个深度优先森林
1 #include<iostream> 2 using namespace std; 3 #define NIL -1 4 int g[1000][1000]; 5 int n; 6 struct Node 7 { 8 int color; 9 int d; 10 int f; 11 int pi; 12 }t[1000]; 13 int time; 14 15 void DFS(); 16 void DFS_VISIT(int u); 17 18 void DFS() 19 { 20 for (int i=0;i<n;i++) 21 { 22 t[i].color = 0; 23 t[i].pi = NIL; 24 } 25 time=1; 26 for (int i=0;i<n;i++) 27 { 28 if (t[i].color == 0) 29 DFS_VISIT(i); 30 } 31 } 32 void DFS_VISIT(int u) 33 { 34 t[u].d = time++; 35 t[u].color = 1; /*****/ 36 for (int v=0;v<n;v++) 37 { 38 if ((g[u][v] == 1)&&(t[v].color == 0)) 39 { 40 t[v].pi = u; 41 DFS_VISIT(v); 42 } 43 } 44 t[u].f = time++; 45 } 46 /* 47 int main() 48 { 49 while (cin>>n) 50 { 51 for (int i=0;i<n;i++) 52 { 53 for (int j=0;j<n;j++) 54 { 55 cin>>g[i][j]; 56 } 57 } 58 DFS(); 59 for (int i=0;i<n;i++) 60 cout<<i<<" "<<t[i].d<<" "<<t[i].f<<" "<<endl; 61 } 62 return 0; 63 } 64 */