第一题60分
    第二题时间不够,第二题如下:

    1. import java.util.*;
    2. public class Main{
    3. public static int count2;
    4. public static void main(String[] args){
    5. Scanner scanner=new Scanner(System.in);
    6. int n=Integer.parseInt(scanner.nextLine());
    7. Set<Node> set2=new HashSet<>();
    8. String tar=scanner.nextLine();
    9. for(int i=0;i<n;i++){
    10. String[] s=scanner.nextLine().split(" ");
    11. Node temp0=null;
    12. for(Node node:set2){
    13. if(node.val.equals(s[0])){
    14. temp0=node;
    15. }
    16. }
    17. if(temp0==null){
    18. temp0=new Node(s[0]);
    19. set2.add(temp0);
    20. }
    21. if("null".equals(s[1])){//1.字符串的"null",不是null 2.字符串判断相等一定要用equals,不要用==
    22. }else{
    23. Node temp1=null;
    24. for(Node node:set2){
    25. if(node.val.equals(s[1])){
    26. temp1=node;
    27. break;
    28. }
    29. }
    30. if(temp1==null){
    31. Node temp=new Node(s[1]);
    32. set2.add(temp);//不要忘记把new出来的对象加入set
    33. temp.next.add(temp0);
    34. temp0.pre=temp;
    35. }else{
    36. temp1.next.add(temp0);
    37. temp0.pre=temp1;
    38. }
    39. }
    40. if("null".equals(s[2])){
    41. }else{
    42. Node temp2=null;
    43. for(Node node:set2){
    44. if(node.val.equals(s[2])){
    45. temp2=node;
    46. break;
    47. }
    48. }
    49. if(temp2==null){
    50. Node temp=new Node(s[2]);
    51. set2.add(temp);
    52. temp0.next.add(temp);
    53. temp.pre=temp0;
    54. }else{
    55. temp0.next.add(temp2);
    56. temp2.pre=temp0;
    57. }
    58. }
    59. }
    60. Node target=null;
    61. for(Node node:set2){
    62. if(tar.equals(node.val)){
    63. target=node;
    64. break;
    65. }
    66. }
    67. dfs(target,0);
    68. int count1=0;
    69. while(target!=null){
    70. count1++;
    71. target=target.pre;
    72. }
    73. System.out.println(count1+count2);
    74. }
    75. public static void dfs(Node node,int idx){
    76. //千万不要写成node.next==null,首先当上一个dfs的node.next容量为0时根本不会进入for循环内部
    77. //从而进入不到当前的dfs的判断条件
    78. //其次由于我默认给next属性赋了初始值,所以它不会为null,最原始的状态的容量为0
    79. if(node.next.size()==0){
    80. count2=Math.max(count2,idx);
    81. return;
    82. }
    83. for(Node nod:node.next){
    84. dfs(nod,idx+1);
    85. }
    86. }
    87. }
    88. class Node{
    89. public Set<Node> next=new HashSet<>();
    90. public Node pre;
    91. public String val;
    92. public Node(String val){
    93. this.val=val;
    94. }
    95. }
    1. 8
    2. d2
    3. d1 null d2
    4. d2 d1 d3
    5. d2 d1 d4
    6. d2 d1 d5
    7. d3 d2 null
    8. d4 d2 null
    9. d5 d2 d6
    10. d6 d5 null
    11. 第一个参数8指的是关系的项数
    12. 第二个参数d2是要查找的设备
    13. 之后的8行是关系
    14. 比如d2 d1 d3表示d2的流入设备是d1d2的流出设备是d3
    15. 比如d1 null d2 表示d1没有流入设备,d1的流出设备是d2
    16. 一个设备只能有一个流入设备,但是可以有多个流出设备
    17. d2的链路最长有多长?
    18. 我的思路是构造双向链表,其中next是一个set<node>集合
    19. pre是一个node节点,
    20. 主要就是把这个双向链表先构建出来
    21. 然后就是根据d2pre一直找到根设备,即该设备的prenull,然后再根据d2next找到最远的设备,
    22. 然后两个流程中计算的值相加就是d2所在的链路的最长值。