当前位置: 首页 > news >正文

图论(dfs深搜系列)9.23

类型一:dfs寻找独立连通块

一、统计无向图中无法互相到达的点的对数

给你一个整数 n ,表示一张 无向图 中有 n 个节点,编号为 0 到 n - 1 。同时给你一个二维整数数组 edges ,其中 edges[i] = [ai, bi] 表示节点 ai 和 bi 之间有一条 无向 边。

思路:

首先找到独立的连通块以及该块中点的个数,一个连通块中的点和其他连通块都是无法互相到达的。所以假设一个连通块的点为x,一共的点为n;x*(n-x)/2。就是无法相互到达的点的对数

1.找到独立的连通块以及块中的个数。

如何找到独立的连通块,每次for循环,进去dfs函数,一连串的就是一个独立的连通块。

所以只需要在dfs中添加一个 记录块中的个数即可。

代码:
class Solution {boolean[] visited;public long countPairs(int n, int[][] edges) {//计算出每一个连通块中的个数就OKint size=edges.length;visited=new boolean[n];List<List<Integer>> links=new ArrayList<>();for(int i=0;i<n;i++)links.add(new ArrayList<>());for(int i=0;i<size;i++){links.get(edges[i][0]).add(edges[i][1]);links.get(edges[i][1]).add(edges[i][0]);}//计算无法相互到达的点数long res=0;for(int i=0;i<n;i++){if(visited[i])continue;long cnt=dfs(i,links);res+=cnt*(n-cnt);}return res/2;}public long dfs(int current,List<List<Integer>> links){long count=1;visited[current]=true;for(int next:links.get(current)){if(!visited[next]){count+=dfs(next,links);}}return count;}
}

难度递增,数据结构上增加难度

二、两个城市间路径的最小分数

给你一个正整数 n ,表示总共有 n 个城市,城市从 1 到 n 编号。给你一个二维数组 roads ,其中 roads[i] = [ai, bi, distancei] 表示城市 ai 和 bi 之间有一条 双向 道路,道路距离为 distancei 。城市构成的图不一定是连通的。

两个城市之间一条路径的 分数 定义为这条路径中道路的 最小 距离。

城市 1 和城市 n 之间的所有路径的 最小 分数。

题意:

让求从城市1->n之间,所有路径的最小分数。注意:路径是可以折返的;并且题目保证从1->n之间一定有一条路。

思路:

所以这道题就让我们求,以1开始的连通块中边的最小分数。

但是难点在于,两边之间不仅仅是点的序号,还有之间的距离。

所以在使用数据结构定义邻接表的时候就要考虑清楚。

之前定义邻接表的时候是:List<List<Integer>> links;集合里面存放集合,第一个集合是所有点的邻接表;第二个集合是下标为i的点的表。但是这个长度是与下标为i的点相邻的点的个数

在这里我们要用::List<List<int[]>> 或者 List<int[]>[] 两种方式来定义。

代码:
class Solution {boolean[] visited;public int minScore(int n, int[][] roads) {//在一个数组里面放的集合,集合里元素的类型是int[]visited=new boolean[n+1];List<int[]>[] links=new ArrayList[n+1];for(int i=1;i<=n;i++)links[i]=new ArrayList<>();//初始化邻接表for(int[] road:roads){int x=road[0];int y=road[1];int distance=road[2];links[x].add(new int[]{y,distance});links[y].add(new int[]{x,distance});}return dfs(1,links);}public int dfs(int current,List<int[]>[] links){visited[current]=true;int min=Integer.MAX_VALUE;for(int[] arr:links[current]){min=Math.min(min,arr[1]);if(!visited[arr[0]]){min=Math.min(min,dfs(arr[0],links));}}return min;}
}

三、统计完全连通分量的数量

给你一个整数 n 。现有一个包含 n 个顶点的 无向 图,顶点按从 0 到 n - 1 编号。给你一个二维整数数组 edges 其中 edges[i] = [ai, bi] 表示顶点 ai 和 bi 之间存在一条 无向 边。

完全连通分量:每个点之间都有一条边相连;所以:点*(点-1)/2==边数
思路:

判断每个连通块中边和点的数目,只要!visited[next],dfs(next,links)。进去dfs函数之后,点就+1;

    public void dfs(int current,List<List<Integer>> links){visited[current]=true;data[0]++;}

在对下标为i的邻接表进行遍历的时候,有边就++;但是会多数一倍。

    public void dfs(int current,List<List<Integer>> links){visited[current]=true;data[0]++;for(int next:links.get(current)){data[1]++;if(!visited[next]){dfs(next,links);}}}
代码:
class Solution {boolean[] visited;int[] data;public int countCompleteComponents(int n, int[][] edges) {//对于每个连通分量 计算其中的节点数和边数List<List<Integer>> links=new ArrayList<>();visited=new boolean[n];//构建邻接表for(int i=0;i<n;i++)links.add(new ArrayList<>());for(int i=0;i<edges.length;i++){links.get(edges[i][0]).add(edges[i][1]);links.get(edges[i][1]).add(edges[i][0]);}data=new int[2];int res=0;for(int i=0;i<n;i++){if(!visited[i]){dfs(i,links);if(data[1]==data[0]*(data[0]-1))res++;}data[0]=0;data[1]=0;}return res;}public void dfs(int current,List<List<Integer>> links){visited[current]=true;data[0]++;for(int next:links.get(current)){data[1]++;if(!visited[next]){dfs(next,links);}}}
}


http://www.mrgr.cn/news/34238.html

相关文章:

  • Javascript 判断数据类型
  • Spring Boot实现文件上传与OSS集成:从基础到应用
  • 真正的一站式视频出海解决方案
  • 网页web无插件播放器EasyPlayer.js点播播放器遇到视频地址播放不了的现象及措施
  • [智能车摄像头是一种安装在汽车上用于辅助驾驶和提高安全性的重要设备]
  • 利用 Vue.js 开发动态组件的实战指南
  • 甩锅笔记:好好的服务端应用突然起不来,经定位是无法访问外网了?测试又说没改网络配置,该如何定位?
  • 基于Ambari搭建hadoop生态圈+Centos7安装教程V2.0优化版(本篇博客写的较为详细,可能比较多,请耐心看)
  • 【BetterBench博士】2024年华为杯E题:高速公路应急车道紧急启用模型 Python代码实现
  • 最适配达梦、人大金仓的sql工具是什么?
  • HTTP代理域名解析的先后顺序:深入解析
  • 共享内存详解
  • 51WORLD打造土耳其奥斯曼尼耶城市大脑,助力中东城市智慧化转型
  • 深入解析:从URL到页面渲染的完整过程与性能优化【页面渲染、重排、重汇】
  • 仓颉编程语言4,遇到BUG求助
  • 浅谈人工智能技术,对社会经济变革的思考
  • Linux(麒麟系统)多显示器屏幕录制
  • 软件测试实验室如何利用GB/T25000标准建立测试技术体系
  • 828华为云征文 | 云服务器Flexus X实例,Docker集成搭建NGINX
  • 超详细超实用!!!AI编程之cursor编写官网新增轮播效果(三)
  • 【二分算法】模板总结
  • 系统分析师12:系统规划
  • 沁恒CH32V307读写flash出错
  • 远程升级频频失败?你可能忽略了模组差分包…
  • 学生宿舍管理:Spring Boot框架的高效策略
  • Apache Iceberg 概述