题: poj3895
    求组成的最大环的边数
    最大环 - 图1
    =>最大环是 4 (2-6-5-7-2)
    思路: bfs 或者 dfs 都可以解决
    记录每次访问点的个数, 用arr[] 标记当前点是可能组成的环上的第几个点
    当前点 - 字节点放问点 ,得到的最大值就是最大的环值
    maxAnswer = Math.max(maxAnswer, findNode[a[0]]-findNode[arrlist.get(i)]+1);

    1. package tuLun;
    2. import java.io.BufferedReader;
    3. import java.io.IOException;
    4. import java.io.InputStreamReader;
    5. import java.util.ArrayList;
    6. import java.util.Arrays;
    7. import java.util.Deque;
    8. import java.util.LinkedList;
    9. import java.util.StringTokenizer;
    10. /**
    11. * poj3895
    12. * @author XA-GDD
    13. *
    14. */
    15. public class 最大环 {
    16. static int T,N,M;
    17. static int[] findNode;
    18. static int maxAnswer;
    19. static boolean[] vistNode;
    20. static ArrayList<ArrayList<Integer>> arrayList;
    21. public static void main(String[] args) throws IOException {
    22. BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    23. StringTokenizer st = new StringTokenizer(br.readLine());
    24. T = Integer.parseInt(st.nextToken());
    25. for (int t = 0; t < T; t++) {
    26. st = new StringTokenizer(br.readLine());
    27. N = Integer.parseInt(st.nextToken()); //点数
    28. M = Integer.parseInt(st.nextToken()); //变数
    29. findNode = new int[N+1];
    30. vistNode = new boolean[N+1];
    31. Arrays.fill(vistNode, false);
    32. arrayList = new ArrayList<ArrayList<Integer>>();
    33. for (int i = 0; i <= N; i++) {
    34. arrayList.add(new ArrayList<Integer>());
    35. }
    36. for (int i = 0; i < M; i++) {
    37. st = new StringTokenizer(br.readLine());
    38. int a = Integer.parseInt(st.nextToken());
    39. int b = Integer.parseInt(st.nextToken());
    40. arrayList.get(a).add(b);
    41. arrayList.get(b).add(a);
    42. }
    43. maxAnswer = 0;
    44. for (int i = 1; i <= N; i++) {
    45. if (!vistNode[i]) {
    46. // dfs(i,1);
    47. bfs(i,1);
    48. }
    49. }
    50. if (maxAnswer>2) {
    51. System.out.println(maxAnswer);
    52. }else {
    53. System.out.println("0");
    54. }
    55. }
    56. }
    57. private static void bfs(int vist, int vistNodeNum) {
    58. Deque<int[]> dq = new LinkedList<int[]>();
    59. dq.offerLast(new int[] {vist,vistNodeNum});
    60. findNode[vist] = vistNodeNum;
    61. while (!dq.isEmpty()) {
    62. int[] a = dq.pollLast();
    63. vistNode[a[0]] = true;
    64. ArrayList<Integer> arrlist = arrayList.get(a[0]);
    65. for (int i = 0; i < arrlist.size(); i++) {
    66. if (!vistNode[arrlist.get(i)]) {
    67. dq.offer(new int[] {arrlist.get(i),a[1]+1});
    68. findNode[arrlist.get(i)] = a[1]+1;
    69. }else {
    70. maxAnswer = Math.max(maxAnswer, findNode[a[0]]-findNode[arrlist.get(i)]+1);
    71. }
    72. }
    73. }
    74. }
    75. private static void dfs(int vist, int findNodeNum) {
    76. findNode[vist] = findNodeNum;
    77. vistNode[vist] = true;
    78. ArrayList<Integer> tempList = arrayList.get(vist);
    79. for (int i = 0; i < tempList.size(); i++) {
    80. if (!vistNode[tempList.get(i)]) {
    81. dfs(tempList.get(i), findNodeNum+1);
    82. }else {
    83. maxAnswer = Math.max(maxAnswer, findNode[vist] - findNode[tempList.get(i)]+1);
    84. }
    85. }
    86. }
    87. }