首先遍历输入,使用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);
}
}



京公网安备 11010502036488号