题目:
第一行输入N, 0<N<=100000 第一行输入N,0<N<=100000接下来是N行代表每个小朋友希望和谁分到一组,如"John Jack", 代表 接下来是N行代表每个小朋友希望和谁分到一组,如“John Jack”,代表John希望和Jack分到-组,两个名字之间以空格分割,名字本身不存在空 约翰希望和杰克分到-组,两个名字之间以空格分割,名字本身不存在空格。
示例:
输入
6
Jack Tom
Alice John
Jessica Leonie
Tom Alice
John Jack
Leonie Jessica
输出
//利用图的深度优先遍历,统计结点之间有边且都未访问过
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Scanner;
public class Main1 {
static class Node{
LinkedList<Node> edges=new LinkedList<>(); //存放与这个结点有边的结点
boolean visit =false; //判断是否遍历
}
static int n;
static HashMap<String,Node> nodes;
public static void dfs(Node node){
node.visit=true;
for (Node edge:node.edges
) {
if(!edge.visit){
dfs(edge);
}
}
}
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
n=scanner.nextInt();
scanner.nextLine();
nodes=new HashMap<String,Node>(n); //判断是否已经统计了这个结点
for (int i = 0; i < n; i++) {
String s=scanner.nextLine();
String[] names=s.split(" ");
Node a,b;
//判断a,b节点是否已存在
if(!nodes.containsKey(names[0])){
a=new Node();
nodes.put(names[0],a );
}else {
a=nodes.get(names[0]);
}
if(!nodes.containsKey(names[1])){
b=new Node();
nodes.put(names[1],b );
}else {
b=nodes.get(names[1]);
}
//a,b之间有边
a.edges.add(b);
b.edges.add(a);
}
int count =0;
for (String s:nodes.keySet()
) {
Node node=nodes.get(s);
if(!node.visit){
dfs(node);
count++;
}
}
System.out.println(count);
}
}