Greedy Algorithm-Radio Broadcasting Problem

package org.greed;

import java.util.*;

/**
 * 广播电视台覆盖区域-贪心算法 选择最少的电台覆盖所有的地区
 * 1用一个结合存放 未被覆盖地区集合,
 * 2遍历一遍电台,统计每个电台覆盖的地区与未被覆盖的交集,找到交集最大的电台
 * 3把第二部获取到的电台存放到一个集合中,在未被覆盖的地区集合中remove掉2,中电台覆盖的地区
 * 4,2,3,一直循环执行,直到 未被覆盖的集合的size=0结束
  @author cjj_1
 * @date 2020-09-08 10:28
 */
public class Greed4Broadcast {
    
    
    public static void main(String[] args) {
    
    
        Map<String, List<String>> map = new HashMap<String, List<String>>(){
    
    
            {
    
    
                put("k1",new ArrayList<String>(){
    
    {
    
    
                    add("上海");
                    add("北京");
                    add("天津");
                }});
                put("k2",new ArrayList<String>(){
    
    {
    
    
                    add("广州");
                    add("北京");
                    add("深圳");
                }});
               put("k3",new ArrayList<String>(){
    
    {
    
    
                add("程度");
                add("上海");
                add("杭州");
            }});
                put("k4",new ArrayList<String>(){
    
    {
    
    
                    add("上海");
                    add("天津");
                }});
                put("k5",new ArrayList<String>(){
    
    {
    
    
                    add("杭州");
                    add("大连");
                }});
            }
        };
        List<String> stations = new ArrayList<>();
       Set<String> sets = getAllArea(map);
       while (sets.size()!=0){
    
    
           String k = getOptimalMatching(sets,map);
           stations.add(k);
           List<String> areas = map.get(k);
           areas.forEach(a->{
    
    
               sets.remove(a);
           });
       }
        System.out.println(Arrays.toString(stations.toArray()));
    }
    public static  void addStation(Map<String, List<String>> map,Set<String> set,String station,List<String> stations){
    
    
        stations.add(station);
    }

    /**
     * 获取到覆盖最多的广播站
     * @param sets
     * @param map
     * @return
     */
    public static String getOptimalMatching(Set<String> sets,Map<String, List<String>> map){
    
    
        String station =null;
        int match_max_num=0;
        for (Map.Entry<String,List<String>> entry:map.entrySet()){
    
    
            List<String> list = entry.getValue();
            int match_num =0;
            for(String area:list){
    
    
                if(sets.contains(area))
                    match_num++;
            }
            if(match_max_num<match_num){
    
    
                station = entry.getKey();
                match_max_num = match_num;
            }
        }
        return station;
    }

    /**
     * 获取所有的地区列表
     * @param map
     * @return
     */
    public static Set<String> getAllArea(Map<String, List<String>> map){
    
    
        Set<String> set = new HashSet<String>();
        for (Map.Entry<String,List<String>> entry:map.entrySet()){
    
    
           List<String> list = entry.getValue();
           list.forEach(l->{
    
    
               set.add(l);
           });
        }
        return set;
    }

}

Guess you like

Origin blog.csdn.net/weixin_40128696/article/details/108468243