题解 | 探索宇宙中的星系联盟

探索宇宙中的星系联盟

https://www.nowcoder.com/practice/888ca0b08bdb4eb099b93432a131ca67

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
//import javax.swing.text.html.Map;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        // 读取星系总数
        int n = sc.nextInt();
        sc.nextLine();
        // 存储星系名称到文明等级的映射
        Map<String,Integer> map=new HashMap<>();
        // 存储所有星系名称
        List<String> allGalaxies=new ArrayList<>();

        for (int i = 0; i < n; i++) {
            String[] arr = sc.nextLine().split(" ");
            String name = arr[0];
            int level = Integer.parseInt(arr[1]);
            map.put(name,level);
            allGalaxies.add(name);
        }

        // 读取星际航道总数
        int m = sc.nextInt();
        sc.nextLine();
        // 构建邻接表表示星系间的连接关系
        Map<String,List<String>> relationship=new HashMap<>();
        for (String galaxy:allGalaxies) {
            relationship.put(galaxy,new ArrayList<>());
        }
        for (int i = 0; i < m; i++) {
            String[] arrStr = sc.nextLine().split(" ");
            String a = arrStr[0];
            String b = arrStr[1];
            relationship.get(a).add(b);
            relationship.get(b).add(a);
        }

        // 找出所有连通分量(星系联盟)
        Set<String> visited=new HashSet<>();
        List<List<String>> alliances=new ArrayList<>();
        for (String galaxy:allGalaxies) {
            if (!visited.contains(galaxy)){
                List<String> alliance=new ArrayList<>();
                dfs(galaxy,visited,relationship,alliance);
                alliances.add(alliance);
            }
        }

        // 计算每个联盟的总实力,并找出最强联盟
        int max=0;

        List<String> stragenestAlliance=null;
        for (List<String> alliance:alliances) {
            int total=0;
            for (String galaxy:alliance) {
                total+=map.get(galaxy);
            }
            if (total>max){
                max=total;
                stragenestAlliance=alliance;
            }
        }

        int highestLevel=0;
        String highestLevelGalaxy="";
        // 找出最强联盟中文明等级最高的星系
        for (String galaxy:stragenestAlliance) {
            int level = map.get(galaxy);
            if (level>highestLevel){
                highestLevel=level;
                highestLevelGalaxy=galaxy;
            }
        }
        System.out.println(highestLevelGalaxy+" "+max);
    }
    
    public static void dfs(String current,Set<String> visited,Map<String,List<String>> relationship,        List<String> alliance){
        visited.add(current);
        alliance.add(current);
        for (String neighbor:relationship.get(current)) {
            if (!visited.contains(neighbor))
            dfs(neighbor,visited,relationship,alliance);
        }
    }
}

全部评论

相关推荐

12-05 18:09
已编辑
广东药科大学 后端工程师
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务