第一题60分
第二题时间不够,第二题如下:
import java.util.*;public class Main{public static int count2;public static void main(String[] args){Scanner scanner=new Scanner(System.in);int n=Integer.parseInt(scanner.nextLine());Set<Node> set2=new HashSet<>();String tar=scanner.nextLine();for(int i=0;i<n;i++){String[] s=scanner.nextLine().split(" ");Node temp0=null;for(Node node:set2){if(node.val.equals(s[0])){temp0=node;}}if(temp0==null){temp0=new Node(s[0]);set2.add(temp0);}if("null".equals(s[1])){//1.字符串的"null",不是null 2.字符串判断相等一定要用equals,不要用==}else{Node temp1=null;for(Node node:set2){if(node.val.equals(s[1])){temp1=node;break;}}if(temp1==null){Node temp=new Node(s[1]);set2.add(temp);//不要忘记把new出来的对象加入settemp.next.add(temp0);temp0.pre=temp;}else{temp1.next.add(temp0);temp0.pre=temp1;}}if("null".equals(s[2])){}else{Node temp2=null;for(Node node:set2){if(node.val.equals(s[2])){temp2=node;break;}}if(temp2==null){Node temp=new Node(s[2]);set2.add(temp);temp0.next.add(temp);temp.pre=temp0;}else{temp0.next.add(temp2);temp2.pre=temp0;}}}Node target=null;for(Node node:set2){if(tar.equals(node.val)){target=node;break;}}dfs(target,0);int count1=0;while(target!=null){count1++;target=target.pre;}System.out.println(count1+count2);}public static void dfs(Node node,int idx){//千万不要写成node.next==null,首先当上一个dfs的node.next容量为0时根本不会进入for循环内部//从而进入不到当前的dfs的判断条件//其次由于我默认给next属性赋了初始值,所以它不会为null,最原始的状态的容量为0if(node.next.size()==0){count2=Math.max(count2,idx);return;}for(Node nod:node.next){dfs(nod,idx+1);}}}class Node{public Set<Node> next=new HashSet<>();public Node pre;public String val;public Node(String val){this.val=val;}}
8d2d1 null d2d2 d1 d3d2 d1 d4d2 d1 d5d3 d2 nulld4 d2 nulld5 d2 d6d6 d5 null第一个参数8指的是关系的项数第二个参数d2是要查找的设备之后的8行是关系比如d2 d1 d3表示d2的流入设备是d1,d2的流出设备是d3比如d1 null d2 表示d1没有流入设备,d1的流出设备是d2一个设备只能有一个流入设备,但是可以有多个流出设备求d2的链路最长有多长?我的思路是构造双向链表,其中next是一个set<node>集合pre是一个node节点,主要就是把这个双向链表先构建出来然后就是根据d2的pre一直找到根设备,即该设备的pre为null,然后再根据d2的next找到最远的设备,然后两个流程中计算的值相加就是d2所在的链路的最长值。
