# 1615.最大网络秩 (Medium)

## 问题描述
[1615. 最大网络秩 (Medium)](https://leetcode.cn/problems/maximal-network-rank/)

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

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

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

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

**示例 1：**

**![](https://pic-upyun.zwyyy456.tech/smms/2023-12-26-065321.png)**

```
输入：n = 4, roads = [[0,1],[0,3],[1,2],[1,3]]
输出：4
解释：城市 0 和 1 的网络秩是 4，因为共有 4 条道路与城市 0 或 1 相连。位于 0 和 1
之间的道路只计算一次。

```

**示例 2：**

**![](https://pic-upyun.zwyyy456.tech/smms/2023-12-26-065323.png)**

```
输入：n = 5, roads = [[0,1],[0,3],[1,2],[1,3],[2,3],[2,4]]
输出：5
解释：共有 5 条道路与城市 1 或 2 相连。

```

**示例 3：**

```
输入：n = 8, roads = [[0,1],[1,2],[2,3],[2,4],[5,6],[5,7]]
输出：5
解释：2 和 5 的网络秩为 5，注意并非所有的城市都需要连接起来。

```

**提示：**

- `2 <= n <= 100`
- `0 <= roads.length <= n * (n - 1) / 2`
- `roads[i].length == 2`
- `0 <= aᵢ, bᵢ <= n-1`
- `aᵢ != bᵢ`
- 每对城市之间 **最多只有一条** 道路相连

## 解题思路
利用邻接矩阵存图，来判断两点之间是否相连，建立邻接矩阵的时候记录与当前点直接相连的点的数量，然后遍历点集。

## 代码
```cpp
class Solution {
  public:
    int maximalNetworkRank(int n, vector<vector<int>> &roads) {
        vector<vector<int>> graph(n, vector<int>(n));
        vector<int> cnt(n); // 统计每个点有多少个点与它相连
        for (auto &vec : roads) {
            graph[vec[0]][vec[1]] = 1;
            cnt[vec[0]]++;
            graph[vec[1]][vec[0]] = 1;
            cnt[vec[1]]++;
        }
        int num = 0;
        for (int i = 0; i < n - 1; ++i) {
            for (int j = i + 1; j < n; ++j) {
                if (graph[i][j] == 1) {
                    num = std::max(num, cnt[i] + cnt[j] - 1);
                } else {
                    num = std::max(num, cnt[i] + cnt[j]);
                }
            }
        }
        return num;
    }
};
```

