图的两种遍历:DFS&BFS
DFS和BFS在图中的应用:
图连通性判定;路径的存在性;图中是否存在环;求图的最小生成树;求图的关键路径;求图的拓扑排序。
DFS:简单的说,先一直往深处走,直到不能再深了,再从另一条路开始往深处走,直到所有路都走完;
struct node { int next; //E[i].next指向图中与i同父的下一个结点 int to; //E[i].to指向图中i的子结点 }E[110]; int N; int fa[110]; //记录各点的父结点 bool vis[110]; //记录这个点是否走过 void DFS(int u) { vis[u]=1; for(int i=fa[u];i!=-1;i=E[i].next) if(vis[E[i].to]==0) DFS(E[i].to); //DFS靠递归实现 }
BFS:把图看成树,先在同一层遍历各结点,再一层一层地依次往下遍历;
//用队列queue实现 bool vis[110]; void BFS(int root,int N) //有N个点的图,从root点开始遍历(搜索) { queue<int> que; memset(vis,0,sizeof(vis)); vis[root]=1; que.push(root); int u; while(!que.empty()) //当图不是空的时候 { u=que.front(); //将队首值赋给变量u que.pop(); //删除队首元素 for(int i=fa[u];i!=-1;i=E[i].next) //找到和u相连的所有点 if(vis[E[i].to]==0) { vis[E[i].to]=1; que.push(E[i].to); } } }