最大网络号怎么算(1615. 最大网络秩)
题目描述:
n 座城市和一些连接这些城市的道路 roads 共同组成一个基础设施网络 。每个 roads[i] = [ai, bi] 都表示在城市 ai 和 bi 之间有一条双向道路 。
两座不同城市构成的 城市对 的 网络秩 定义为:与这两座城市 直接 相连的道路总数 。如果存在一条道路直接连接这两座城市 ,则这条道路只计算 一次 。
整个基础设施网络的 最大网络秩 是所有不同城市对中的 最大网络秩 。
给你整数 n 和数组 roads ,返回整个基础设施网络的 最大网络秩 。
来源链接
示例1:
示例2:
示例3:
题目解析
使用一个数组road_size统计每个城市的直接相连道路数 ,使用一个数组flag统计任意两个城市之间是否存在相连道路 ,枚举所有城市对 ,计算网络秩 。
关键在于如何计算城市对(i,j)的网络秩:
网络秩是与这两座城市直接相连的道路总数 ,因此首先要分别得到城市i和城市j相连的道路数 ,记为road_size[i]和road_size[j];
道路总数就等于road_size[i] + road_size[j];
但是如果城市i和城市j之间有道路连接 ,那么在统计road_size[i]和road_size[j]都会将这条道路统计进去 ,即存在重复统计,因此需要在最终结果再减1;因此我们需要统计两个内容:
每个城市的直接相连道路数road_size[i] ,使用一个长度为n的数组进行统计;
任意两个城市之间是否存在相连道路flag[i][j] ,使用一个规模为n × n的数组进行统计,存在记为true ,不存在记为false;
因此城市对(i,j)的网络秩 = road_size[i] + road_size[j] - flag[i][j] , 枚举所有城市对,找到最大网络秩 。代码:
class Solution { public: int maximalNetworkRank(int n, vector<vector<int>>& roads) { vector<int>road_size(n, 0); vector<vector<bool>>flag(n, vector<bool>(n, false)); int row = roads.size(); if(row==0) { return 0; } for(int m=0; m<row; ++m) { road_size[roads[m][0]]++; road_size[roads[m][1]]++; flag[roads[m][0]][roads[m][1]]=true; flag[roads[m][1]][roads[m][0]]=true; } int ma=0; int tmp=0; for(int i=0; i<n; ++i) { for(int j=i+1; j<n; ++j) { tmp=road_size[i]+road_size[j]-flag[i][j]; if(ma<tmp) { int change = tmp; tmp = ma; ma = change; } } } return ma; } };创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!