题: poj3895
求组成的最大环的边数
=>最大环是 4 (2-6-5-7-2)
思路: bfs 或者 dfs 都可以解决
记录每次访问点的个数, 用arr[] 标记当前点是可能组成的环上的第几个点
当前点 - 字节点放问点 ,得到的最大值就是最大的环值
maxAnswer = Math.max(maxAnswer, findNode[a[0]]-findNode[arrlist.get(i)]+1);
package tuLun;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.ArrayList;import java.util.Arrays;import java.util.Deque;import java.util.LinkedList;import java.util.StringTokenizer;/*** poj3895* @author XA-GDD**/public class 最大环 {static int T,N,M;static int[] findNode;static int maxAnswer;static boolean[] vistNode;static ArrayList<ArrayList<Integer>> arrayList;public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));StringTokenizer st = new StringTokenizer(br.readLine());T = Integer.parseInt(st.nextToken());for (int t = 0; t < T; t++) {st = new StringTokenizer(br.readLine());N = Integer.parseInt(st.nextToken()); //点数M = Integer.parseInt(st.nextToken()); //变数findNode = new int[N+1];vistNode = new boolean[N+1];Arrays.fill(vistNode, false);arrayList = new ArrayList<ArrayList<Integer>>();for (int i = 0; i <= N; i++) {arrayList.add(new ArrayList<Integer>());}for (int i = 0; i < M; i++) {st = new StringTokenizer(br.readLine());int a = Integer.parseInt(st.nextToken());int b = Integer.parseInt(st.nextToken());arrayList.get(a).add(b);arrayList.get(b).add(a);}maxAnswer = 0;for (int i = 1; i <= N; i++) {if (!vistNode[i]) {// dfs(i,1);bfs(i,1);}}if (maxAnswer>2) {System.out.println(maxAnswer);}else {System.out.println("0");}}}private static void bfs(int vist, int vistNodeNum) {Deque<int[]> dq = new LinkedList<int[]>();dq.offerLast(new int[] {vist,vistNodeNum});findNode[vist] = vistNodeNum;while (!dq.isEmpty()) {int[] a = dq.pollLast();vistNode[a[0]] = true;ArrayList<Integer> arrlist = arrayList.get(a[0]);for (int i = 0; i < arrlist.size(); i++) {if (!vistNode[arrlist.get(i)]) {dq.offer(new int[] {arrlist.get(i),a[1]+1});findNode[arrlist.get(i)] = a[1]+1;}else {maxAnswer = Math.max(maxAnswer, findNode[a[0]]-findNode[arrlist.get(i)]+1);}}}}private static void dfs(int vist, int findNodeNum) {findNode[vist] = findNodeNum;vistNode[vist] = true;ArrayList<Integer> tempList = arrayList.get(vist);for (int i = 0; i < tempList.size(); i++) {if (!vistNode[tempList.get(i)]) {dfs(tempList.get(i), findNodeNum+1);}else {maxAnswer = Math.max(maxAnswer, findNode[vist] - findNode[tempList.get(i)]+1);}}}}
