有向图的可达性分析
有向图可达性分析
- 题目描述:
题目描述:
题目首先给出n个英文单词,代表从每个单词的第一个字母可以变换为该单词的最后一个字母,总共有n种情况嘛。 那么问你,从单个字母b开始,能否通过这n个字母变换为字母m? 如果可以则输出yes,否则输出no。 Java代码如何编写?
import java.util.*;
/**
测试用例:1bm-yes3bxxmby-yes2aacc-no4bbbxxmmm-yes5baabbmmaaz-yes1b-no6bccddmbeeffm-yes2bxym-no3maabbc-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");}
}
