1.背景
2.代码
package com.ldp.algorithm.demo03Greedy;
import org.junit.Test;
import java.util.*;
/**
* @create 06/03 9:10
* @description <p>
* 贪心算法
* 需求:
* 广播台 覆盖地区
* K1 北京,上海,天津
* K2 广州,北京,深圳
* K3 成都,上海,杭州
* K4 上海,天津
* K5 杭州,大连
* </p>
*/
public class Test01 {
@Test
public void test01() {
// 广播站kMap
Map<String, HashSet<String>> kMap = new HashMap<>();
// 需要覆盖的城市
HashSet<String> listCity = new HashSet<>();
// 已选择的广播站
// Map<String, HashSet<String>> kMapSelect = new HashMap<>();
List<String> kMapSelect = new ArrayList<>();
// 初始化数据
init(kMap, listCity);
System.out.println(listCity);
// 存放某个电台覆盖地区与所有需要覆盖地区的交集
HashSet<String> tempK = new HashSet<>();
// 找出覆盖城市最多的广播站
int maxSize = 0;
String maxNameK = "";
// 最大的交集
HashSet<String> maxRetainK = new HashSet<>();
while (listCity.size() > 0) {
for (String item : kMap.keySet()) {
// 清空临时变量
tempK.clear();
HashSet<String> itemK = kMap.get(item);
// 加入当前电台需要覆盖度额地区
tempK.addAll(itemK);
// 与需要覆盖地区的交集,存放于tempK中
tempK.retainAll(listCity);
// 计算tmpK的覆盖地区个数
int size = tempK.size();
if (size > maxSize) {
maxSize = size;
maxNameK = item;
maxRetainK.addAll(tempK);
}
}
// 找到一个可以添加的电台
if (maxSize > 0) {
kMapSelect.add(maxNameK);
// 删除已添加的电台
kMap.remove(maxNameK);
// 移除已经覆盖的电台地区
listCity.removeAll(maxRetainK);
// 最大交集清零
maxRetainK.clear();
maxSize = 0;
} else {
System.out.println("没有找到可以添加的电台,地区没有覆盖完整");
break;
}
}
System.out.println("已选择的电台:" + kMapSelect);
}
public void init(Map<String, HashSet<String>> kMap, HashSet<String> listCity) {
HashSet<String> k1List = new HashSet<>();
k1List.add("北京");
k1List.add("上海");
k1List.add("天津");
kMap.put("K1", k1List);
HashSet<String> k2List = new HashSet<>();
k2List.add("广州");
k2List.add("北京");
k2List.add("深圳");
kMap.put("K2", k2List);
HashSet<String> k3List = new HashSet<>();
k3List.add("成都");
k3List.add("上海");
k3List.add("杭州");
kMap.put("K3", k3List);
HashSet<String> k4List = new HashSet<>();
k4List.add("上海");
k4List.add("天津");
kMap.put("K4", k4List);
HashSet<String> k5List = new HashSet<>();
k5List.add("杭州");
k5List.add("大连");
kMap.put("K5", k5List);
for (String item : kMap.keySet()) {
listCity.addAll(kMap.get(item));
}
}
}
完美!