有向图可达性分析
题目描述:
题目首先给出n个英文单词,代表从每个单词的第一个字母可以变换为该单词的最后一个字母,总共有n种情况嘛。 那么问你,从单个字母b开始,能否通过这n个字母变换为字母m? 如果可以则输出yes,否则输出no。 Java代码如何编写?
import java.util.*;
/**
测试用例:
1
bm
-yes
3
bx
xm
by
-yes
2
aa
cc
-no
4
bb
bx
xm
mm
-yes
5
ba
ab
bm
ma
az
-yes
1
b
-no
6
bc
cd
dm
be
ef
fm
-yes
2
bx
ym
-no
3
ma
ab
bc
-no
*/
public class 有向图可达性2 {
public static void main(String[] args) {
//1. 邻接表做法,更通用
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
Map<Integer, Set<Integer>> adj = new HashMap<>();
for (int i = 0; i < 26; i++) adj.put(i, new HashSet<>());
for (int i = 0; i < n; i++) {
String s = sc.next();
int start = s.charAt(0) - 'a';
int end = s.charAt(s.length()-1) - 'a';
adj.get(start).add(end); //添加有向边
}
//2. BFS, 'b' -> 'm'
int src = 'b' - 'a';
int dest = 'm' - 'a';
Set<Integer> visited = new HashSet<>();
Deque<Integer>q = new ArrayDeque<>();
q.add(src);
visited.add(src);
boolean flag = false;
//3. 开始查找
while (!q.isEmpty()) {
int cur = q.poll();
if (cur == dest) {
flag = true;
break;
}else{
for (int next : adj.get(cur)) {
if (!visited.contains(next)) {
visited.add(next);
q.add(next);
}
}
}
}
System.out.println(flag ? "YES" : "NO");
}
}
6057

被折叠的 条评论
为什么被折叠?



