【Day45 LeetCode】图论问题 Ⅲ

embedded/2025/2/22 6:14:51/

一、图论问题 Ⅲ

1、沉没孤岛

这题只能从边界开始扩散,将靠近边界的陆地标记,表示不是孤岛,最后将孤岛沉没,将不是孤岛标记回陆地。

# include<iostream>
# include<vector>using namespace std;void dfs(vector<vector<int>> &graph, int i, int j){if(i<0 || i>=graph.size() || j<0 || j>=graph[0].size() || graph[i][j]!=1)return;graph[i][j] = 2;dfs(graph, i+1, j);dfs(graph, i-1, j);dfs(graph, i, j+1);dfs(graph, i, j-1);
}int main(){int n, m;cin >> n >> m;vector<vector<int>> graph(n, vector<int>(m));for(int i=0; i<n; ++i)for(int j=0; j<m; ++j)cin >> graph[i][j];// 步骤一:// 从左侧边,和右侧边 向中间遍历for (int i = 0; i < n; i++) {if (graph[i][0] == 1) dfs(graph, i, 0);if (graph[i][m - 1] == 1) dfs(graph, i, m - 1);}// 从上边和下边 向中间遍历for (int j = 0; j < m; j++) {if (graph[0][j] == 1) dfs(graph, 0, j);if (graph[n - 1][j] == 1) dfs(graph, n - 1, j);}for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {if (graph[i][j] == 1) graph[i][j] = 0;if (graph[i][j] == 2) graph[i][j] = 1;}}for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {cout << graph[i][j] << " ";}cout << endl;}return 0;
}

2、水流问题

如果想着从当前点向两个边界移动的话,时间复杂度过高,因为需要遍历每个点,每个点又需要扩散到两个边界。如果我们逆向思维,想着从边界出发去找可达的点,这一下就豁然开朗了。

# include<iostream>
# include<vector>using namespace std;vector<vector<int>> dirs = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
void dfs(vector<vector<int>> &graph, vector<vector<bool>> &vis,int ii, int jj){if(vis[ii][jj])return;vis[ii][jj] = true;for(auto xy : dirs){int i = ii + xy[0], j = jj + xy[1];if(i<0 || i>=graph.size() || j<0 || j>=graph[0].size() || graph[ii][jj] > graph[i][j] || vis[i][j])continue;dfs(graph, vis, i, j);}
}int main(){int n, m;cin >> n >> m;vector<vector<int>> graph(n, vector<int>(m));for(int i=0; i<n; ++i)for(int j=0; j<m; ++j)cin >> graph[i][j];vector<vector<bool>> vis1(n, vector<bool>(m, false));vector<vector<bool>> vis2(n, vector<bool>(m, false)); for(int i=0; i<n; ++i){dfs(graph, vis1, i, 0);dfs(graph, vis2, i, m-1);}for(int i=0; i<m; ++i){dfs(graph, vis1, 0, i);dfs(graph, vis2, n-1, i);}for(int i=0; i<n; ++i){for(int j=0; j<m; ++j){if(vis1[i][j] && vis2[i][j])cout << i << " " << j << endl;}}return 0;
}

3、建造最大岛屿

写了个很不优雅的代码,思路是 DFS遍历陆地,给每个岛屿一一对应的编号,并用哈希表记录编号与岛屿面积的对应关系。然后,第二次遍历图,遇到水域,遍历水域的四个方向上的编号,进行面积累加,一个细节是需要用set进行去重,可能四个反向上存在编号相同的区域。

# include<iostream>
# include<vector>
# include<unordered_map>
# include<unordered_set>
using namespace std;int dfs(vector<vector<int>> &graph, int i, int j, int num){if(i<0 || i>=graph.size() || j<0 || j>=graph[0].size() || graph[i][j]!=1)return 0;graph[i][j] = num;return 1 + dfs(graph, i+1, j, num)+ dfs(graph, i-1, j, num)+ dfs(graph, i, j+1, num)+ dfs(graph, i, j-1, num);
} int main(){int n, m;cin >> n >> m;vector<vector<int>> graph(n, vector<int>(m));for(int i=0; i<n; ++i)for(int j=0; j<m; ++j)cin >> graph[i][j];unordered_map<int, int> mp; // 映射几号陆地 与 其面积关系mp[0] = 0;int idx = 2; // 几号陆地 int ans = 0;for(int i=0; i<n; ++i){for(int j=0; j<m; ++j){if(graph[i][j]==1){mp[idx] = dfs(graph, i, j, idx);ans = max(ans, mp[idx]);++idx;}}}vector<vector<int>> dirs = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};for(int i=0; i<n; ++i){for(int j=0; j<m; ++j){if(graph[i][j]==0){int tmp = 1;unordered_set<int> set;for(auto xy : dirs){int x = i + xy[0], y = j + xy[1];if(x>=0 && x<n && y>=0 && y<m && set.find(graph[x][y])==set.end()){set.insert(graph[x][y]);tmp += mp[graph[x][y]];}}ans = max(ans, tmp);}}}cout << ans << endl;return 0;
}

http://www.ppmy.cn/embedded/164251.html

相关文章

MySQL-SQL

1.客户端内置命令 客户端内置命令客户端独有&#xff0c;可能不同数据库产品的客户端内置命令存在很大差异&#xff0c;不像SQL命令有标准规范。 help \h ? \? 这四个命令都可以输出帮助文档查看客户端内置命令 &#xff1f;&#xff08;\&#xff1f;&#xff09;“帮助”…

如何在 Vue 应用中实现权限管理?

在 Vue 应用中实现权限管理是确保用户只能访问其有权访问的资源的重要步骤。以下是一些常见的步骤和最佳实践&#xff0c;用于在 Vue 应用中实现权限管理。 1. 定义权限结构 首先&#xff0c;需要定义应用的权限结构。这通常包括角色和权限的概念。 角色和权限示例 角色&am…

三种安全协议 IPSec SSL PGP

IPSec、SSL和PGP是三种常见的安全协议&#xff0c;它们在不同的应用场景中被用来保障数据的保密性、完整性和身份验证。 1. IPSec (Internet Protocol Security) 功能&#xff1a;IPSec是一个用于在IP网络上实现安全通信的协议套件&#xff0c;主要用于保护IP数据包的传输。它…

将Neo4j用于Python学习的创新方法

Neo4j作为一款强大的图数据库&#xff0c;其独特的关系性特点能够为Python学习带来全新的视角和深度理解。通过将Neo4j与Python学习相结合&#xff0c;可以帮助学生更直观、更深入地掌握Python编程的各个方面。以下是具体的建议和方法&#xff1a; 1. 利用Neo4j可视化Python数…

LeetCode216

LeetCode216 目录 题目描述示例思路分析代码段代码逐行讲解复杂度分析总结的知识点整合总结 题目描述 找出所有相加之和为 target 的 k 个数的组合&#xff0c;且满足以下条件&#xff1a; 只使用数字 1 到 9。每个数字最多使用一次。 返回所有可能的有效组合的列表。组合…

网易严选DevOps实践:从传统到云原生的演进

在互联网行业的快速变革中&#xff0c;网易严选面临着前所未有的挑战和机遇。为了提升产品研发运营效率&#xff0c;降低创新成本&#xff0c;网易严选积极拥抱DevOps文化&#xff0c;并在其实践过程中积累了宝贵的经验。本文将深入探讨网易严选在DevOps领域的实践之旅&#xf…

哈希:LeetCode49. 字母异位词分组 128.最长连续序列

49. 字母异位词分组 给你一个字符串数组&#xff0c;请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 示例 1: 输入: strs ["eat", "tea", "tan", "ate",…

HBase性能优化秘籍:让数据处理飞起来

HBase性能优化秘籍&#xff1a;让数据处理飞起来 数据处理太慢&#xff1f;别担心&#xff0c;这里有解决方案&#xff01; 你是否遇到过这样的情况&#xff1a;随着数据量的不断增加&#xff0c;HBase的查询和写入速度变得越来越慢&#xff1f;别担心&#xff0c;今天我们就…