首先遍历输入,使用map记录星系和文明等级的对应关系,初始时将所有星系看作一个单独的星系团
然后遍历道路输入,对于每一个输入,存在两种情况
- 如果道路两侧已经在同一个星系团中,跳过
- 如果道路两侧不在同一个星系团中,则将这两个星系团合并
最后遍历所有星系团,找出其中最大的星系团和其中文明等级最高的星系
import java.util.*; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int starNumber = in.nextInt(); HashMap<String , Integer> starLevel = new HashMap<>(); List<ArrayList<String>> starList = new ArrayList<>(); for(int i = 0; i < starNumber;i ++){ String starName = in.next(); int level = in.nextInt(); starLevel.put(starName,level); ArrayList<String> list = new ArrayList<>(); list.add(starName); //初始时所有星系单独放置 starList.add(list); } int roadNum = in.nextInt(); for(int i = 0; i < roadNum;i++){ String starName1 = in.next(); String starName2 = in.next(); int size = starList.size(); for(int j = 0;j < size;j++){ if(starList.get(j).contains(starName1)){ //如果两个星系本就在一起,则跳过 if(starList.get(j).contains(starName2))break; else for(int k = 0;k < size;k++){ if(starList.get(k).contains(starName2)){ //此时两个星系j和k是联通的,将他们放入同一个list中 starList.get(j).addAll(starList.get(k)); starList.remove(starList.get(k)); size --; break; } } break; } } } int maxTotal = 0; String maxString = ""; for(int i = 0;i < starList.size();i ++){ int curTotal = 0; String curMaxString = ""; int curMaxLevel = 0; for(String str:starList.get(i)){ int curLevel = starLevel.get(str); curTotal+= curLevel; if(curLevel > curMaxLevel){ curMaxLevel = curLevel; curMaxString = str; } } if(curTotal > maxTotal){ maxTotal = curTotal; maxString = curMaxString; } } System.out.print(maxString + " " + maxTotal); } }