代码:
package com.wangyq.datastructrue.arithmetic;
import java.util.*;
/**
* 贪心算法-广播站
*/
public class GreedyAlgorithm {
public static void main(String[] args) {
//存储一共要覆盖哪些城市
List<String> areaList = new ArrayList<>();
areaList.add("上海");
areaList.add("天津");
areaList.add("深圳");
areaList.add("成都");
areaList.add("杭州");
areaList.add("大连");
// 存储每个电台覆盖的城市
HashSet<String> broadcasting1 = new HashSet<>();
broadcasting1.add("北京");
broadcasting1.add("上海");
broadcasting1.add("天津");
HashSet<String> broadcasting2 = new HashSet<>();
broadcasting2.add("广州");
broadcasting2.add("北京");
broadcasting2.add("深圳");
HashSet<String> broadcasting3 = new HashSet<>();
broadcasting3.add("成都");
broadcasting3.add("上海");
broadcasting3.add("杭州");
HashSet<String> broadcasting4 = new HashSet<>();
broadcasting4.add("上海");
broadcasting4.add("天津");
HashSet<String> broadcasting5 = new HashSet<>();
broadcasting5.add("杭州");
broadcasting5.add("大连");
//存放所有电台
Map<String, HashSet<String>> broadcastingMap = new HashMap<>();
broadcastingMap.put("电台1", broadcasting1);
broadcastingMap.put("电台2", broadcasting2);
broadcastingMap.put("电台3", broadcasting3);
broadcastingMap.put("电台4", broadcasting4);
broadcastingMap.put("电台5", broadcasting5);
List broadcastingList = greedyAlgorithm(areaList, broadcastingMap);
System.out.println("选择的电台是:" + broadcastingList);
}
private static List greedyAlgorithm(List<String> areaList, Map<String, HashSet<String>> broadcastingMap) {
List broadcastingList = new ArrayList();
//全部覆盖则退出循环
while (!areaList.isEmpty()) {
List temp = new ArrayList();
int tempInt = 0;
String broadcastingName = "";
for (Map.Entry<String, HashSet<String>> broadcasting : broadcastingMap.entrySet()) {
//获取当前电台覆盖的区域
HashSet<String> broadcastingSet = broadcasting.getValue();
//清空,重新赋值临时存储当前多有待覆盖区域List
temp.clear();
temp.addAll(areaList);
temp.retainAll(broadcastingSet);
//大于之前存储的电台,进行替换
if (tempInt < temp.size()) {
tempInt = temp.size();
broadcastingName = broadcasting.getKey();
}
}
//添加筛选出来的电台
if (tempInt != 0) {
broadcastingList.add(broadcastingName);
}
//从待覆盖区域中删除新增电台覆盖区域
areaList.removeAll(broadcastingMap.get(broadcastingName));
}
return broadcastingList;
}
}
执行结果:
选择的电台是:[电台3, 电台1, 电台2, 电台5]