题目描述
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;
}
}
执行结果: