SYJ.png
广度优先搜索回答两类问题:
1. 从节点A出发,有前往节点D的路径吗?
2. 从节点A出发,前往节点D的哪条路径最短?演示:
SYJ.png
代码演示
OC实现代码:
//示例:是否存在A到D的路径
#import "ViewController.h"
@interface ViewController ()
@property(nonatomic,strong)NSDictionary *dic;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
_dic = [[NSDictionary alloc] init];
//把每个节点对应的邻居节点存储起来
_dic = @{@"A":@[@"B",@"F"],@"B":@[@"C"],@"C":@[@"D"],@"D":@[],@"E":@[@"C"],@"F":@[@"E",@"G"],@"G":@[@"C"]};
BOOL lj = [self search:@"D"];
if(lj){
NSLog(@"存在A到D的路径");
}else{
NSLog(@"不存在A到D的路径");
}
}
-(BOOL)search:(NSString*)str{
//查找队列
NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity:0];
[array addObject:@"A"];
//存储已经检查过的节点
NSMutableArray *searchedArr = [[NSMutableArray alloc] initWithCapacity:0];
//当查找队列不为空
while ([array count] != 0) {
//取出队列中的一个元素
NSString *name = array[0];
[array removeObjectAtIndex:0];
//检查这个元素是否被检查过
if(![searchedArr containsObject:name]){
//检查是不是要找的节点
if([name isEqualToString:str]){
return YES;
}else{
//将这个节点对应的邻居节点加入查找队列
[array addObjectsFromArray:[_dic objectForKey:name]];
//将这个节点标记为已检查过
[searchedArr addObject:name];
}
}
}
return NO;
}
@endjava代码实现:
import java.util.*;
public class MyClass {
private static Map m1 = new HashMap();
public static void main(String [] args){
m1.put("A" , new String []{"B" , "F" });
m1.put("B" , new String []{"C" });
m1.put("C" , new String []{"D" });
m1.put("D" , new String []{});
m1.put("E" , new String []{"C" });
m1.put("F" , new String []{"E" ,"G" });
m1.put("G" , new String []{"C" });
boolean lj = search("G" );
if (lj){
System.out.println("cz" );
}else {
System.out.println("bcz" );
}
}
private static boolean search(String str){
Queue<String > queue = new LinkedList<String >();
queue.offer("A" );
String [] searchedArray = new String [0 ];
while (queue.size() != 0 ){
String name = queue.poll();
if (!Arrays.asList(searchedArray).contains(name)){
if (name == str){
return true ;
}else {
String [] s = (String []) m1.get(name);
for (int i = 0 ;i<s.length;i++){
queue.offer(s[i]);
}
searchedArray = Arrays.copyOf(searchedArray,searchedArray.length+1 );
searchedArray[searchedArray.length-1 ] = name;
}
}
}
return false ;
}
}python实现代码:
from collections import deque
def search(str):
queue = deque()
queue += 'A'
searched = []
while queue:
name = queue.popleft()
if not name in searched:
if name == str:
return True
else :
queue += dict[name]
searched.append(name)
return False
dict = {'A' :['B' ,'F' ],'B' :['C' ],'C' :['D' ],'D' :[],'E' :['C' ],'F' :['E' ,'G' ],'G' :['C' ]}
if search('D' ):
print('cz' )
else :
print('bcz' )