赞
踩
IGMP 协议中响应报文和查询报文,是维系组播通路的两个重要报文,在一条已经建立的组播通路中两个相邻的 HOST 和 ROUTER,ROUTER 会给 HOST 发送查询报文,HOST 收到查询报文后给 ROUTER 回复一个响应报文,以维持相之间的关系,一旦这关系断裂,那么这条组播通路就异常”了。现通过某种手段,抓取到了 HOST 和 ROUTER 两者通讯的所有响应报文和查询报文,请分析该组播通路是否“正常”
第一行抓到的报文数量C (C≤100) ,后续C行依次输入设备节点D1和D2,表示从D1到D2发送了单向的报文,D1和D2用空格隔开。
组播通路是否“正常”,正常输出True, 异常输出False。
输入 | 5 1 2 2 3 3 2 1 2 2 1 |
输出 | True |
说明 | 无 |
输入 | 3 1 3 3 2 2 3 |
输出 | False |
说明 | 无 |
具体·解析看代码
package com.bytesoc.calc; import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class T70 { static class Route { int start; int end; boolean startToEnd; boolean endToStart; public boolean equals(Route obj) { return (obj.start == this.start && obj.end == this.end) || (obj.start == this.end && obj.end == this.start); } } public static void main(String[] args) { Scanner sc = new Scanner(System.in); int line = Integer.parseInt(sc.nextLine()); List<Route> routes = new ArrayList<>(); for (int i = 0; i < line; i++) { Route route = new Route(); String str = sc.nextLine(); route.start = Integer.parseInt(str.split(" ")[0]); route.end = Integer.parseInt(str.split(" ")[1]); Route objRoute = findRoute(routes, route); if (objRoute == null) { route.startToEnd = true; routes.add(route); } else { System.out.println(objRoute.end + "-" + route.start); if (objRoute.end == route.start) { objRoute.endToStart = true; } } } for (Route r : routes) { if (r.startToEnd == false || r.endToStart == false) { System.out.println("FALSE"); System.exit(0); } } System.out.println("TRUE"); } public static Route findRoute(List<Route> routes, Route route) { for (Route r : routes) { if (r.equals(route)) { return r; } } return null; } }
执行结果:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。