GuilinDev

Lc1615

05 August 2008

1615 Maximal Network Rank

n 座城市和一些连接这些城市的道路 roads 共同组成一个基础设施网络。每个 roads[i] = [ai, bi] 都表示在城市 ai 和 bi 之间有一条双向道路。

两座不同城市构成的 城市对 的 网络秩 定义为:与这两座城市 直接 相连的道路总数。如果存在一条道路直接连接这两座城市,则这条道路只计算 一次 。

整个基础设施网络的 最大网络秩 是所有不同城市对中的 最大网络秩 。

给你整数 n 和数组 roads,返回整个基础设施网络的 最大网络秩 。

保存所有道路(已排序),对任意两点穷举他们的路径后找出最大

邻接矩阵,总时间复杂度O(N^2)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution {
    public int maximalNetworkRank(int n, int[][] roads) {
        int[][] map =new int[n][n];//邻接矩阵
        int[] degree =new int[n];//出度
        for (int[] road : roads) {
            map[road[0]][road[1]]++;
            map[road[1]][road[0]]++;
            degree[road[0]]++;
            degree[road[1]]++;
        }
        int ans =Integer.MIN_VALUE;
        for (int i = 0; i <n-1 ; i++) {
            for (int j = i+1; j <n ; j++) {
                int temp = degree[i]+degree[j]-map[i][j]; //出度和减去重复的边
                ans = Math.max(ans,temp);
            }
        }
        return ans;
    }
}

邻接表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class Solution {
 public int maximalNetworkRank(int n, int[][] roads) {
      List<Set<Integer>> list = new ArrayList<>();
      int k = roads.length;
      if(k == 0){
    	  return 0;
      }
      for(int i = 0 ; i < n; i++){
    	  list.add(new HashSet<>());
      }
      for(int i = 0; i < k; i++){
    	  int a = roads[i][0];
    	  int b = roads[i][1];
    	  list.get(a).add(b);
    	  list.get(b).add(a);
      }
      int max = 0;
      for(int i = 0; i < n; i++){
    	  for(int j = 0; j < n; j++){
        	  if(i!=j){
        		  int a = list.get(i).contains(j)?1:0;
        		  int pre = list.get(i).size()+list.get(j).size()-a;
        		  max = max>pre?max:pre;
        	  }
          }
      }
      return max;
    }
}