题目描述
给你一个整数 n ,表示一个国家里的城市数目。城市编号为 0 到 n - 1 。
给你一个二维整数数组 roads ,其中 roads[i] = [ai, bi] 表示城市 ai 和 bi 之间有一条 双向 道路。
你需要给每个城市安排一个从 1 到 n 之间的整数值,且每个值只能被使用 一次 。道路的 重要性 定义为这条道路连接的两座城市数值 之和 。
请你返回在最优安排下,所有道路重要性 之和 最大 为多少。
提示
- 2 <= n <= 5 * 104
- 1 <= roads.length <= 5 * 104
- roads[i].length == 2
- 0 <= ai, bi <= n - 1
- ai != bi
- 没有重复道路。
解题思路
利用贪心的策略,将连接点数最多的点被安排最大的编号(反之连接线断最少的被安排最小的编号),依次安排完毕完。每个点有多少个连接线,那么他的所被安排的值就会加多少次。
long long maximumImportance(int n, vector<vector<int>>& roads) {
vector<int> tmp(n,0);
for(auto x:roads){
for(auto y:x){
tmp[y]++;//计算每一个点有多少个连接线段
}
}
long long ans=0;
sort(tmp.begin(),tmp.end());//排序,连接线段最多的被安排最大的值,反之连接线断最少的被安排最小的值
for(int i=1;i<=n;i++)
ans+=1ll*i*tmp[i-1];//1ll(1 long long)是为了高精度计算
return ans;
}