greedy algorithm

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);

    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值