package com.gxmedu.greedy_algorithm;
import java.util.*;
/**
* @author 郭学明
* @version 1.0
* 选择最少的广播台让所有地区都能接收到
*/
public class SetCoveringProblem {
public static void main(String[] args) {
HashMap<String, HashSet<String>> broadcast = new HashMap<>();
HashSet<String> k1 = new HashSet<>();
HashSet<String> k2 = new HashSet<>();
HashSet<String> k3 = new HashSet<>();
HashSet<String> k4 = new HashSet<>();
HashSet<String> k5 = new HashSet<>();
k1.add("北京");
k1.add("上海");
k1.add("天津");
k2.add("广州");
k2.add("北京");
k2.add("深圳");
k3.add("成都");
k3.add("上海");
k3.add("杭州");
k4.add("上海");
k4.add("天津");
k5.add("杭州");
k5.add("大连");
broadcast.put("k1",k1);
broadcast.put("k2",k2);
broadcast.put("k3",k3);
broadcast.put("k4",k4);
broadcast.put("k5",k5);
/**
* 把选择结果放在selections这个集合里
*/
ArrayList<String> selections = new ArrayList<>();
HashSet<String> allAreas = new HashSet<>();
Collection<HashSet<String>> k = broadcast.values();
Iterator<HashSet<String>> iterator = k.iterator();
while(iterator.hasNext()){
HashSet<String> next = iterator.next();
allAreas.addAll(next);
}
// System.out.println(allAreas);
Set<Map.Entry<String, HashSet<String>>> entries = broadcast.entrySet();
while(allAreas.size() != 0){
// 每一轮开始前都要把maxKey重置
String maxKey = null;
Iterator<Map.Entry<String, HashSet<String>>> iterator2 = entries.iterator();
while(iterator2.hasNext()){
Map.Entry<String, HashSet<String>> next = iterator2.next();
// 用来存放交集和上一次的交集
HashSet<String> temp = new HashSet<>();
HashSet<String> lastTemp = new HashSet<>();
if(maxKey != null){
lastTemp.addAll(broadcast.get(maxKey));
lastTemp.retainAll(allAreas);
}
String currentKey = next.getKey();
temp.addAll(next.getValue());
temp.retainAll(allAreas);
if(temp.size() > 0 && (maxKey == null || temp.size() > lastTemp.size())){
maxKey = currentKey;
}
}
// 经过上一次循环我们已经找到当前的最优选择
if(maxKey != null){
selections.add(maxKey);
allAreas.removeAll(broadcast.get(maxKey));
}
}
System.out.println(selections);
}
}
greedy algorithm
最新推荐文章于 2024-06-05 19:09:50 发布