the second one in Weekly Contest 210.
Difficulty : Medium
Related Topics : Graph
There is an infrastructure of
n
cities with some number ofroads
connecting these cities. Eachroads[i] = [ai, bi]
indicates that there is a bidirectional road between citiesai
andbi
.The network rank of two different cities is defined as the total number of directly connected roads to either city. If a road is directly connected to both cities, it is only counted once.
The maximal network rank of the infrastructure is the maximum network rank of all pairs of different cities.
Given the integer
n
and the arrayroads
, return the maximal network rank of the entire infrastructure.Input: n = 4, roads = [[0,1],[0,3],[1,2],[1,3]] Output: 4 Explanation: The network rank of cities 0 and 1 is 4 as there are 4 roads that are connected to either 0 or 1. The road between 0 and 1 is only counted once.
Input: n = 5, roads = [[0,1],[0,3],[1,2],[1,3],[2,3],[2,4]] Output: 5 Explanation: There are 5 roads that are connected to cities 1 or 2.
Input: n = 8, roads = [[0,1],[1,2],[2,3],[2,4],[5,6],[5,7]] Output: 5 Explanation: The network rank of 2 and 5 is 5. Notice that all the cities do not have to be connected.
2 <= n <= 100
0 <= roads.length <= n * (n - 1) / 2
roads[i].length == 2
0 <= ai, bi <= n-1
ai != bi
- Each pair of cities has at most one road connecting them.
- mine
- Java
Runtime: 856 ms, faster than 14.29%, Memory Usage: 42.4 MB, less than 14.29% of Java online submissions
// O(N^2)time // O(N)space public int maximalNetworkRank(int n, int[][] roads) { List<Integer>[] list = new List[n]; for(int i = 0; i < n; i++){ list[i] = new ArrayList<>(); } int roadIndex = 0; for(int[] r : roads){ list[r[0]].add(roadIndex); list[r[1]].add(roadIndex); roadIndex++; } int res = 0; for(int i = 0; i < n ; i++){ for(int j = 0 ; j < n ; j++){ if(i == j) continue; Set<Integer> set = new HashSet<>(); set.addAll(list[i]); set.addAll(list[j]); res = Math.max(set.size(), res); } } return res; }
- Java
- the most votes
Runtime: 3 ms, faster than 99.79%, Memory Usage: 39.2 MB, less than 5.24% of Java online submissions
public int maximalNetworkRank(int n, int[][] roads) { boolean[][] connected = new boolean[n][n]; int[] cnts = new int[n]; for (int[] r : roads) { cnts[r[0]]++; cnts[r[1]]++; connected[r[0]][r[1]] = true; connected[r[1]][r[0]] = true; // cache if i and j directly connected } int res = 0; for (int i = 0; i < n; i++) for (int j = i + 1; j < n; j++) res = Math.max(res, cnts[i] + cnts[j] - (connected[i][j] ? 1 : 0)); // loop all pairs return res; }