代码随想录算法训练营第五十三天 | 图论part04

110. 字符串接龙

思路是要将字符串之间用线连起来,每个相邻的字符串只有一个字符不同。通过bfs来找到最短路径。要注意已经走过的路径要记录下来,包括走过的步数。

但是这一题并没有建图,而是将这个过程简化了,只是记录下了path。

cpp 复制代码
#include <iostream>
#include <vector>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <queue>

using namespace std;

int main() {
    int n;
    string beginStr, endStr, str;
    unordered_set<string> strSet;
    unordered_map<string, int> visitMap;
    queue<string> que;
    
    cin >> n;
    cin >> beginStr >> endStr;
    while (n--) {
        cin >> str;
        strSet.insert(str);
    }
    
    que.push(beginStr);
    visitMap.insert({beginStr, 1});
    
    while (!que.empty()) {
        string word = que.front();
        que.pop();
        int path = visitMap[word];
        
        for (int i = 0; i < word.size(); ++i) {
            string newWord = word;
            for (int j = 0; j < 26; ++j) {
                newWord[i] = 'a' + j;
                if (newWord == endStr) {
                    cout << path + 1 << endl;
                    return 0;
                }
                if (strSet.count(newWord) == 0) continue;
                if (visitMap.find(newWord) == visitMap.end()) {
                    visitMap.insert({newWord, path + 1});
                    que.push(newWord);
                }
            }
        }
    }
    cout << 0 << endl;
    return 0;
}

105. 有向图的完全可达性

cpp 复制代码
#include <iostream>
#include <vector>
#include <unordered_set>
#include <list>

using namespace std;

void dfs(const vector<list<int>> &graph, unordered_set<int> &visited, int node) {
    if (visited.count(node) != 0) return;
    
    visited.insert(node);
    for (int n : graph[node]) {
        dfs(graph, visited, n);
    }
}

int main() {
    int n, m, node1, node2;
    cin >> n >> m;
    
    vector<list<int>> graph(n + 1);
    while (m--) {
        cin >> node1 >> node2;
        graph[node1].push_back(node2);
    }
    
    unordered_set<int> visited;
    
    dfs(graph, visited, 1);
    
    if (visited.size() == n) cout << 1;
    else cout << -1;
    return 0;
}

06. 岛屿的周长

确实陷入惯性思维了

cpp 复制代码
#include <iostream>
#include <vector>

using namespace std;



int main() {
    int n, m;
    cin >> n >> m;
    vector<vector<int>> grid(n, vector<int>(m, 0));
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < m; ++j) {
            cin >> grid[i][j];
        }
    }
    
    int sum = 0, cover = 0;
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < m; ++j) {
            if (grid[i][j] == 1) {
                sum++;
                if (i-1 >=0 && grid[i-1][j] == 1) cover++;
                if (j-1 >=0 && grid[i][j-1] == 1) cover++;
            }
        }
    }
    cout << sum*4-cover*2;
}
相关推荐
zy_destiny4 分钟前
【工业场景】用YOLOv26实现8种道路隐患检测
人工智能·深度学习·算法·yolo·机器学习·计算机视觉·目标跟踪
怡步晓心l17 分钟前
Mandelbrot集合的多线程并行计算加速
c++·算法·缓存
老鼠只爱大米24 分钟前
LeetCode经典算法面试题 #114:二叉树展开为链表(递归、迭代、Morris等多种实现方案详细解析)
算法·leetcode·二叉树·原地算法·morris遍历·二叉树展开
Ivanqhz30 分钟前
现代异构高性能计算(HPC)集群节点架构
开发语言·人工智能·后端·算法·架构·云计算·边缘计算
HyperAI超神经1 小时前
覆盖天体物理/地球科学/流变学/声学等19种场景,Polymathic AI构建1.3B模型实现精确连续介质仿真
人工智能·深度学习·学习·算法·机器学习·ai编程·vllm
执着2591 小时前
力扣hot100 - 144、二叉树的前序遍历
数据结构·算法·leetcode
范纹杉想快点毕业1 小时前
嵌入式系统架构之道:告别“意大利面条”,拥抱状态机与事件驱动
java·开发语言·c++·嵌入式硬件·算法·架构·mfc
近津薪荼1 小时前
递归专题(4)——两两交换链表中的节点
数据结构·c++·学习·算法·链表
2501_940315261 小时前
【无标题】2390:从字符串中移除*
java·开发语言·算法
乐观勇敢坚强的老彭1 小时前
c++寒假营day01下午
c++·算法