1、模拟
我们可以使用二维矩阵来记录节点之间的邻接矩阵,同时使用一个数组来记录每个节点的度。而后我们遍历整个数组,找到其中度第一大和第二大的节点,并将其加入相应的数组,而后进行分类讨论:
- 若度最大的数组中只有一个元素,则肯定我们需要从度第二大的数组中取一个城市计算结果。我们遍历度第二大的数组,若其中有城市与度第一大的城市不相连,则直接返回
max1 + max2
,否则返回max1 + max2 - 1
。 - 若度第一大的数组中有不止一个元素,则我们需要遍历度最大的数组。若其中有两个城市不相连,则师姐返回
2 * max1
,否则返回2 * max1 - 1
。
class Solution {
public:
int maximalNetworkRank(int n, vector<vector<int>> &roads) {
int max1 = 0, max2 = 0;
vector<int> degree(n);
vector<vector<int>> top(2);
vector<vector<bool>> adj(n, vector<bool>(n));
for (auto item: roads) {
degree[item[0]]++;
degree[item[1]]++;
adj[item[0]][item[1]] = true;
adj[item[1]][item[0]] = true;
}
for (int i = 0; i < n; ++i) {
if (degree[i] > max1) {
max2 = max1;
top[1] = top[0];
max1 = degree[i];
top[0].clear();
top[0].emplace_back(i);
} else if (degree[i] == max1) {
top[0].emplace_back(i);
} else if (degree[i] > max2) {
top[1].clear();
max2 = degree[i];
top[1].emplace_back(i);
} else if (degree[i] == max2) {
top[1].emplace_back(i);
}
}
if (top[0].size() == 1) {
for (int i = 0; i < top[1].size(); ++i) {
if (!adj[top[0][0]][top[1][i]]) {
return max1 + max2;
}
}
return max1 + max2 - 1;
} else {
for (int i = 0; i < top[0].size(); ++i) {
for (int j = 0; j < top[0].size(); ++j) {
if (i != j && !adj[top[0][i]][top[0][j]]) {
return 2 * max1;
}
}
}
return 2 * max1 - 1;
}
}
};