最多的国家的同盟-dfs遍历

题干

若干国家组成多个同盟,你需要返回包含最多国家的联盟的国家数

输入说明

输入一行字符串,按照;分割,分割的子元素表示两个国家间是同盟关系,同盟关系具有传递性

输入
1,2;2,3;3,4

输出
4


输入
1,2;2,3;3,4;5,6;6,7;7,8;8,9

输出
5

思路

使用哈希表记录每个国家的直接同盟国,创建一个集合记录已经访问过哪些国家,在每一次深搜之前都创建一个同盟国集合,然后从一个国家开始搜索

如果这个国家没有被访问过,我们就访问所有与他直接同盟的国家,并将这个国家加入集合,最后得到这个集合的大小,如果是最大的则保留这个值

代码

import java.util.*;

public class test {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String input = scanner.nextLine();

        Map> allianceMap = new HashMap<>();
        String[]  alliances = input.split(";");
        for (String alliance : alliances){
            String[] members = alliance.split(",");
            int member1 = Integer.parseInt(members[0]);
            int member2 = Integer.parseInt(members[1]);

            allianceMap.computeIfAbsent(member1,k -> new ArrayList<>()).add(member2);
            allianceMap.computeIfAbsent(member2,k -> new ArrayList<>()).add(member1);
        }

        Set visited = new HashSet<>();
        int maxVal = 0;

        for(int member : allianceMap.keySet()){
            if(!visited.contains(member)){
                Set alliance = new HashSet<>();
                dfs(member,allianceMap,visited,alliance);
                maxVal = Math.max(maxVal,alliance.size());
            }
        }

        System.out.println(maxVal);

    }

    private static void dfs(int member, Map> allianceMap, Set visited, Set alliance){
        visited.add(member);
        alliance.add(member);

        for(int neighbor : allianceMap.get(member)){
            if(!visited.contains(neighbor)){
                dfs(neighbor,allianceMap,visited,alliance);
            }
        }
    }
}

你可能感兴趣的:(深度优先,算法)