华为OD机试真题【报文回路】

1、题目描述

【报文回路】
IGMP 协议中响应报文和查询报文,是维系组播通路的两个重要报文,
在一条已经建立的组播通路中两个相邻的 HOST 和 ROUTER,
ROUTER 会给 HOST 发送查询报文,HOST 收到查询报文后给 ROUTER 回复一个响应报文,
以维持相之间的关系,一旦这关系断裂,那么这条组播通路就异常”了。
现通过某种手段,抓取到了 HOST 和 ROUTER 两者通讯的所有响应报文和查询报文,请分析该组播通路是否“正常”。
【输入描述】
第一行为一个整数n,表示抓到的报文数量。后续n行每行两个整数d1和d2表示互通。
【输出描述】
组播通路是否正常,正常输出True,否则输出False
【示例】
5
1 2
2 3
3 2
1 2
2 1

2、解题思路

题目有点难以理解,维持相互之间互通的关系条件是相邻的两个响应报文和查询报文之间必须互通,解题思路是运用Map来存储与Host报文连通的Router报文,统计完之后再检查与Host报文连通的Router报文是否也与Host报文互通,存在不互通就是False,否则是True。

3、参考代码

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;

/**
 * @Author 
 * @Date 2023/6/11 14:56
 */
public class 报文回路 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNext()) {
            int n = in.nextInt();
            Map<Integer, Set<Integer>> map = new HashMap<>();
            for (int i = 0; i < n; i++) {
                int d1 = in.nextInt();
                int d2 = in.nextInt();
                map.putIfAbsent(d1, new HashSet<>());
                map.putIfAbsent(d2, new HashSet<>());
                map.get(d1).add(d2);
            }

            String res = "True";
            for (Integer d1 : map.keySet()) {
                for (Integer d2 : map.get(d1)) {
                    if (!map.get(d2).contains(d1)) {
                        res = "False";
                        break;
                    }
                }
                if ("False".equals(res)) {
                    break;
                }
            }
            System.out.println(res);
        }
    }
}

你可能感兴趣的:(华为0D机试真题,java,算法,开发语言,OD,Map)