力扣-图论-4【算法学习day.54】

打印 上一主题 下一主题

主题 1769|帖子 1769|积分 5307

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
前言

###我做这类文章一个重要的目的还是给正在学习的大家提供方向和记录学习过程(例如想要掌握底子用法,该刷哪些题?)我的解析也不会做的非常详细,只会提供思绪和一些关键点,力扣上的大佬们的题解质量是非常非常高滴!!!

习题

1.连通网络的操作次数

题目链接:1319. 连通网络的操作次数 - 力扣(LeetCode)
题面:

分析:这题其实就是看图的个数,如果有两块图,那么只需要一根线,如果三块,需要两根.....,所以我们只需要求出图的个数和多余线的个数即可,这里我们采用并查集,遍历connections时,将两个节点通过find函数归并,但如果这两个节点早已归并,如许就相当于多出了一根线,且不需要做归并操作,之后我们遍历每个节点,看他们的父节点有多少个也就是有多少块图,这里用到Map哈希表,最后比力两数即可
代码:
  1. class Solution {
  2.     int[] parent;
  3.     public int makeConnected(int n, int[][] connections) {
  4.     parent =  new int[n];
  5.     for(int i = 0;i<n;i++){
  6.         parent[i] = i;
  7.     }
  8.     int count = 0;
  9.     for(int[] arr:connections){
  10.         int a = arr[0];
  11.         int b = arr[1];
  12.         if(isINALine(a,b)){
  13.             count++;
  14.         }else{
  15.             union(a,b);
  16.         }
  17.     }
  18.     int flag = -1;
  19.     Map<Integer,Integer> map = new HashMap<>();
  20.     for(int i = 0;i<n;i++){
  21.         if(map.getOrDefault(find(i),-1)==-1){
  22.             flag++;
  23.             map.put(find(i),1);
  24.         }
  25.     }
  26.     return count>=flag?flag:-1;
  27.     }
  28.     public int find(int x){
  29.         if(parent[x]!=x){
  30.             parent[x] = find(parent[x]);
  31.         }
  32.         return parent[x];
  33.     }
  34.     public void union(int a,int b){
  35.         int pa = find(a);
  36.         int pb = find(b);
  37.         if(pa!=pb){
  38.             parent[pa] = pb;
  39.         }
  40.     }
  41.     public boolean isINALine(int a,int b){
  42.         return find(a)==find(b);
  43.     }
  44. }
复制代码

2.两个都会间路径的最小分数

题目链接:2492. 两个都会间路径的最小分数 - 力扣(LeetCode)
题面:

分析:1到n可能有多条路径,每条路径由多段路组成,而题目就是求路径中的最小段路的长,这题先采用并查集用底子数据将图初始化一下,我们在遍历数组roads的时候,可以利用Pair将当前路的长度,和在roads中的索引存一下,然后创建一个Pair数组,将pair对象存进去,然后我们排序这个数组,按照key也就是路的长度从小到大排,之后遍历这个pair数组,拿到索引,然后从roads中拿到这段路的两节点号,首先可以明确的是,这两个节点是相连的,例如a,b,如果a的并查集父节点等于1的,也等于n的,就表明a和b和1,n在一个图中,也就是在一条可达路径中,由于我们将pair数组的key从小到大排过序了,那么此时返回pair对象key即可,也就是最短路。 
代码:
  1. class Solution {
  2.     int[] parent;
  3.     public int minScore(int n, int[][] roads) {
  4.         parent = new int[n+1];
  5.         for(int i = 1;i<=n;i++){
  6.             parent[i] = i;
  7.         }
  8.         int m = roads.length;
  9.         Pair<Integer,Integer>[] arr = new Pair[m];
  10.         int count = 0;
  11.         for(int[] brr:roads){
  12.             int a = brr[0];
  13.             int b = brr[1];
  14.             union(a,b);
  15.             Pair<Integer,Integer> p = new Pair<>(brr[2],count);
  16.             // System.out.println(p);
  17.             arr[count] = p;
  18.             count++;
  19.         }
  20.          Arrays.sort(arr, (o1, o2) -> o1.getKey()-o2.getKey());
  21.          for(int i = 0;i<n;i++){
  22.             int index = arr[i].getValue();
  23.             int[] brr = roads[index];
  24.             int a = brr[0];
  25.             int b = brr[1];
  26.             if(find(1)==find(a)&&find(n)==find(a)){
  27.                 return brr[2];
  28.             }
  29.          }
  30.          return 0;
  31.     }
  32.     public int find(int x){
  33.         if(parent[x]!=x){
  34.             parent[x] = find(parent[x]);
  35.         }
  36.         return parent[x];
  37.     }
  38.     public void union(int a,int b){
  39.         int pa = find(a);
  40.         int pb = find(b);
  41.         if(pa!=pb){
  42.             parent[pa] = pb;
  43.         }
  44.     }
  45.     public boolean isInALine(int a,int b){
  46.         return find(a)==find(b);
  47.     }
  48. }
复制代码

后言

上面是力扣图论专题,下一篇是其他的习题,盼望有所帮助,一同进步,共勉!




免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

熊熊出没

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表