java算法:图遍历
递归图形遍历或深度优先搜索,系统地访问图中所有的结点的方法,如,树的遍历,也是很多递归算法的基础。
访问v,递归地访问每个附属于v的(未访问过的)结点,如果图是连通的,则最终能到达所有的结点。
例1:深度优先搜索
- privatevoiddfs(intk){
- visit(k);
- visited[k]=true;
- for(Nodet=adj[k];t!=null;t=t.next){
- if(!visited[t.v]){
- dfs(t.v);
- }
- }
- }
private void dfs(int k){
visit(k);
visited[k] = true;
for(Node t = adj[k]; t != null; t = t.next){
if(!visited[t.v]){
dfs(t.v);
}
}
}
使用邻接表表示法在具有V个顶点和E条边的图中进行深度优先搜索所需要的时间与V+E成比例。
例2:广度优先搜索
- voidbfs(intk){
- IntQueueq=newIntQueue(v*v);
- q.put(k);
- while(!q.empty()){
- if(!visited[k=q.get()]){
- Nodet;
- visit(k);
- visited[k]=true;
- for(t=adj[k];t!=null;t=t.next){
- if(!visited[t.v]){
- q.put(t.v);
- }
- }
- }
- }
- }
void bfs(int k){
IntQueue q = new IntQueue(v*v);
q.put(k);
while(!q.empty()){
if(!visited[k = q.get()]){
Node t;
visit(k);
visited[k] = true;
for(t = adj[k]; t != null; t = t.next){
if(!visited[t.v]){
q.put(t.v);
}
}
}
}
}