day52 图论part4

文章目录

  • [卡码网 110. 字符串迁移](#卡码网 110. 字符串迁移)
  • [卡码网 105. 有向图的完全联通](#卡码网 105. 有向图的完全联通)
  • [卡码网 106. 海岸线计算](#卡码网 106. 海岸线计算)

卡码网 110. 字符串迁移

注意如何连接连个字符串,然后使用bfs找到一条最短路径。

java 复制代码
import java.util.*;

class Main{
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        String beginStr = sc.next();
        String endStr = sc.next();
        Queue<String> q = new LinkedList<>();
        q.add(beginStr);
        sc.nextLine();
        Set<String> strset = new HashSet<>();
        Map<String, Integer> strmap = new HashMap<>();
        strmap.put(beginStr, 1);
        for (int i = 0; i < n; i++) {
            strset.add(sc.next());
        }
        while(!q.isEmpty()) {
            String word = q.poll();
            for (int i = 0; i < word.length(); i++) {
                char[] newword = word.toCharArray();
                for (char j = 'a'; j <= 'z'; j++) {
                    newword[i] = j;
                    String newString = new String(newword);
                    if (newString.equals(endStr)) {
                        System.out.println(strmap.get(word) + 1);
                        return;
                    }
                    if (strset.contains(newString) && !strmap.containsKey(newString)) {

                        strmap.put(newString, strmap.get(word) + 1);
                        q.add(newString);
                    }
                }
            }
        }
        System.out.println(0);

    }
}

卡码网 105. 有向图的完全联通

使用dfs遍历整个图,遍历到的点使用boolean数组标记。

java 复制代码
import java.util.*;

class Main{

    public static void dfs(List<List<Integer>> graph, int node, boolean[] visited) {
        if (visited[node] == true) {
            return;
        }
        visited[node] = true;
        List<Integer> nodes = graph.get(node);
        for (int nextnode : nodes) {
            dfs(graph, nextnode, visited);
        }
    }
    public static void main(String[] agrs) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int k = sc.nextInt();
        List<List<Integer>> graph = new ArrayList<>();
        for (int i = 0; i <= n; i++) {
            graph.add(new ArrayList<>());
        }
        for (int i = 0; i < k; i++) {
            int s = sc.nextInt();
            int t = sc.nextInt();
            graph.get(s).add(t);
        }
        boolean[] visited = new boolean[n + 1];
        dfs(graph, 1, visited);
        for (int i = 1; i <= n; i++) {
            if (visited[i] == false) {
            System.out.println(-1);
            return;
        }
        }
        System.out.println(1);
    }
}

卡码网 106. 海岸线计算

检查每一个陆地块的周围是否是边缘或者是水,是的话周长就加1。

java 复制代码
import java.util.*;

class Main {
    static int count;
    static int[][] dir = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
    public static void helper(int[][] graph, int x, int y) {
        for (int i = 0; i < 4; i++) {
            int nextx = x + dir[i][0];
            int nexty = y + dir[i][1];
            if (nextx < 0 || nexty < 0 || nextx >= graph.length || nexty >= graph[0].length || graph[nextx][nexty] == 0) {
                count++;
            }
        }
    }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = sc.nextInt();
        int[][] graph = new int[n][m];
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                graph[i][j] = sc.nextInt();
            }
        } 
        int res = 0;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                count = 0;
                if (graph[i][j] == 1) {
                    helper(graph, i, j);
                    res += count;
                }
            }
        }
        System.out.println(res);
    }
}
相关推荐
tankeven2 小时前
最短路径问题00:dijkstra算法
c++·算法
式5162 小时前
CUDA编程学习(五)线程模型定义、矩阵相加
学习·算法·矩阵
C蔡博士2 小时前
大数乘法的算法演进:从小学方法到 Karatsuba
算法·大数乘法·分治思想
2401_844221322 小时前
内存对齐与缓存友好设计
开发语言·c++·算法
橘颂TA2 小时前
【笔试】算法的暴力美学——牛客 NC221681:dd爱框框
算法
天天进步20152 小时前
WrenAI 深度解析:算法视角:wren-ai-service 如何利用 RAG 与 Metadata 提升 SQL 准确率?
人工智能·sql·算法
一叶落4382 小时前
36. 有效的数独(Valid Sudoku)题解(C语言)
c语言·数据结构·算法·leetcode·哈希算法
qiuyunoqy2 小时前
Linux进程 --- 5(进程地址空间初识)
linux·c++·算法
Sakinol#2 小时前
Leetcode Hot 100 ——贪心算法
算法·leetcode·贪心算法