day52 图论章节刷题Part04(110.字符串接龙、105.有向图的完全可达性、106.岛屿的周长 )

广搜和深搜的提高

110.字符串接龙

思路:判断点与点之间的关系,如果差一个字符,那就是有链接;求起点和终点的最短路径长度,无向图求最短路广搜最合适,只要搜到了终点一定是最短的路径。因为广搜就是以起点中心向四周扩散的搜索。

注意:

  • 本题是一个无向图,需要用标记位标记节点是否走过,否则就会死循环!
  • 使用set来检查字符串是否出现在字符串集合里更快一些

代码如下:

java 复制代码
import java.util.*;
public class Main{
    public static int ladderLength(String beginStr,String endStr,List<String> wordList){
        HashSet<String> set=new HashSet<>(wordList);
        //队列存放访问过的单词,BFS
        Queue<String> queue=new LinkedList<>();
        //存放已经访问过的单词
        HashMap<String,Integer> visitMap=new HashMap<>();
        
        queue.offer(beginStr);
        visitMap.put(beginStr,1);
        while(!queue.isEmpty()){
            String curWord=queue.poll();
            int path=visitMap.get(curWord);
            for(int i=0;i<curWord.length();i++){
                char[] ch=curWord.toCharArray();
                for(char k='a';k<='z';k++){
                    ch[i]=k;
                    String newWord=new String(ch);
                    //终止条件
                    if(newWord.equals(endStr)) return path+1;
                    if(set.contains(newWord)&&!visitMap.containsKey(newWord)){
                        visitMap.put(newWord,path+1);
                        queue.offer(newWord);
                    }
                }
            }
        }
        return 0;
        
    }
    public static void main (String[] args) {
        Scanner scan=new Scanner(System.in);
        int n=scan.nextInt();
        scan.nextLine();
        String[] str=scan.nextLine().split(" ");
        List<String> wordList=new ArrayList<>();
        for(int i=0;i<n;i++){
            wordList.add(scan.nextLine());
        }
        int result=ladderLength(str[0],str[1],wordList);
        System.out.println(result);
    }
}

105.有向图的完全可达性

思路:有向图搜索全路径的问题。DFS、BFS均可,一般都可以的时候我习惯使用DFS。该题是说从节点1能否到达所有节点,所以只需要从节点1开始DFS遍历,如果最后所有点都被访问过了输出1,否则-1.

可以选用邻接表或者邻接矩阵来存储数据。

代码如下:

java 复制代码
import java.util.*;
public class Main{
    public static List<List<Integer>> adjList=new LinkedList<>();
    public static void dfs(boolean[] visited,int key){
        if(visited[key]) return;
        visited[key]=true;
        List<Integer> nextKeys=adjList.get(key);
        for(int nextKey:nextKeys){
            dfs(visited,nextKey);
        }
    }
    
    public static void main (String[] args) {
        Scanner scan=new Scanner(System.in);
        int vertexNum=scan.nextInt();
        int edgeNum=scan.nextInt();
        for(int i=0;i<vertexNum;i++){
            adjList.add(new LinkedList<>());
        }
        for(int i=0;i<edgeNum;i++){
            int s=scan.nextInt();
            int t=scan.nextInt();
            adjList.get(s-1).add(t-1);
        }
        boolean[] visited=new boolean[vertexNum];
        dfs(visited,0);
        for(int i=0;i<vertexNum;i++){
            if(!visited[i]) {
                System.out.println(-1);
                return;
            }
        }
        System.out.println(1);;
    }
}

106.岛屿的周长

思路:避免看到岛屿就DFS或者BFS的惯性思维,该题不需要也可以做。

计算出总的岛屿数量,总的边数=岛屿数量 * 4,有一对相邻两个陆地,边的总数就要减2。

代码如下:

java 复制代码
import java.util.*;
public class Main{
    public static void main (String[] args) {
        Scanner scan=new Scanner(System.in);
        int m=scan.nextInt();
        int n=scan.nextInt();
        int[][] graph=new int[m][n];
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                graph[i][j]=scan.nextInt();
            }
        }
        int num=0;
        int cover=0;
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(graph[i][j]==1){
                    num++;
                    if(i-1>=0 && graph[i-1][j]==1) cover++;
                    if(j-1>=0 && graph[i][j-1]==1) cover++;
                }
            }
        }
        int result=num*4-2*cover;
        System.out.println(result);
        
    }
}
相关推荐
超级码力66634 分钟前
【Latex文件架构】Latex文件架构模板
算法·数学建模·信息可视化
穿条秋裤到处跑44 分钟前
每日一道leetcode(2026.04.29):二维网格图中探测环
算法·leetcode·职场和发展
Merlos_wind1 小时前
HashMap详解
算法·哈希算法·散列表
汉克老师2 小时前
GESP2025年3月认证C++五级( 第三部分编程题(1、平均分配))
c++·算法·贪心算法·排序·gesp5级·gesp五级
Yzzz-F4 小时前
Problem - 2205D - Codeforces
算法
智者知已应修善业5 小时前
【51单片机2个按键控制流水灯运行与暂停】2023-9-6
c++·经验分享·笔记·算法·51单片机
Halo_tjn5 小时前
Java Set集合相关知识点
java·开发语言·算法
生成论实验室5 小时前
《事件关系阴阳博弈动力学:识势应势之道》第四篇:降U动力学——认知确定度的自驱演化
人工智能·科技·神经网络·算法·架构
AI科技星6 小时前
全域数学·72分册:场计算机卷【乖乖数学】
算法·机器学习·数学建模·数据挖掘·量子计算
科研前沿7 小时前
镜像孪生VS视频孪生核心技术产品核心优势
大数据·人工智能·算法·重构·空间计算