华为2021-4-7笔试 第一题

该博客介绍了一个关于图论的问题,即根据孩子们的分组意愿来确定可以组成多少个互不冲突的组。通过读取输入的每个孩子希望与之分组的名字,构建了一个图,并利用深度优先遍历来查找所有可能的不重复的分组。代码中定义了Node类来存储节点信息,并实现了深度优先搜索算法进行遍历,最终输出可以形成完整组的数量。
摘要由CSDN通过智能技术生成

题目:

第一行输入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);

    }
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值