求一个无向图的最大环的边数(POJ3895) (java解答)

POJ 3895
题意:
求最大环的边数,给出一个无向图,图中每条边的长度都是1,求图中最长环的长度是多少?

样例:
Sample Input

1 -------->这里是测试次数
7 8 ----------------->七个点,八条边
3 4 ---------------->顶点3到4有一条边
1 4
1 3
7 1
2 7
7 5
5 6
6 2

Sample Output

4

AC代码:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;
import java.util.List;
public class Main {
private int n;//顶点个数
private boolean[] used;//节点状态,值为false的是未访问的
private List< ArrayList< Integer>> G;//邻接表
private int maxlen=0;//最大环的长度
private int[] num;//记录搜索到某顶点时已搜索过的顶点数


public Main(int n,List< ArrayList< Integer>> G){
this.n=n;
this.G=G;
used=new boolean[n+1];
num=new int[n+1];
}


private void dfs(int v, int t) {

num[v] = t; //搜索到v时,已搜索过的顶点数
used[v] = true;
int x = G.get(v).size();
for(int i = 0; i < x; i++){ //对V的每一个邻接点
if(!used[G.get(v).get(i)]){ //没有发现环
dfs(G.get(v).get(i), t + 1);
}
else //发现环,更新最大环的边数
{
if(maxlen < num[v] - num[G.get(v).get(i)] + 1)
maxlen = num[v] - num[G.get(v).get(i)] + 1;
}
}
}
public void go(){
for(int i = 1; i <= n; i++){ //遍历每一个顶点
if(!used[i])
dfs(i, 1); //深度优先搜索
}
if(maxlen > 2) System.out.printf("%d\n", maxlen);
else System.out.println("0");
}

public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int t=sc.nextInt();
while(t-->0){
int n=sc.nextInt();
int m=sc.nextInt();

List< ArrayList< Integer>> G;
G = new ArrayList< ArrayList< Integer>>();//初始化邻接表
for(int i = 1;i<=n+1;i++)
G.add(new ArrayList< Integer>());
for(int i=0;i<m;i++){
int u = sc.nextInt();
int v = sc.nextInt();
G.get(u).add(v);
G.get(v).add(u);
}

Main ma=new Main(n,G);
ma.go();

}
}
}

源码:
展开阅读全文

没有更多推荐了,返回首页