这个题目走了好多弯路
package 网络寻路;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Main{
static List<Integer>[] g;
static long count = 0;
static ArrayList<Integer> road = new ArrayList<Integer>();
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();//节点个数
int M = sc.nextInt();//连接线的条数
sc.nextLine();
g = new ArrayList[N+1];
for(int i = 1;i <= N;i++)
g[i] = new ArrayList<Integer>();
String s = "";
for(int i = 1;i <= M;i++)
{
s = sc.nextLine();
int a = Integer.parseInt(s.split(" ")[0]);
int b = Integer.parseInt(s.split(" ")[1]);
g[a].add(b);
g[b].add(a);
}
for(int i = 1;i<=N;i++)
{
// if(road.size()!=0) {System.out.println("-------------------");}
road.clear();//因为每次调用dfs只是把所有邻居删除,而没有把每次第一次加进去的元素删除,所有每次循环都要手动清除一次
road.add(i);
dfs(i,-1,0);
}
System.out.println(count);
}
/**
*
* @param num 自己是谁
* @param from 从哪里来
* @param step 行走了多少步
*/
static void dfs(int num,int from,int step)
{
if(step==3)
{
if(road.get(0) != road.get(2) && road.get(1)!=road.get(3))
count++;
return;
}
else
{
ArrayList<Integer> neighbors = (ArrayList<Integer>) g[num];//将num的所有邻居取出来
for(int i = 0;i < neighbors.size();i++)//遍历num的所有邻居
{
int bor_neigh = neighbors.get(i);
if(bor_neigh == from)
continue;
road.add(bor_neigh);//该数字有邻居和 他的上一级不相等,则该邻居可以加入
dfs(bor_neigh, num, step+1);//然后再测试这个邻居
road.remove(road.size()-1);//测试完这个数字的邻居后再
}
}
}
}
第一次提交:每次判断该数字的邻居和from不一样时,加入的应该是这个邻居,而不是这个数字。
第二次提交:就是在main函数里面应该首先加入这个数字,因为第一次加数字,肯定之前没有加入过这个数字,然后再去dfs中搜索邻居,而且step是需要3步骤即可,而不是4步骤。
第三次提交:就是每次循环都要保证road中是空的,虽然dfs中有remove,但是仅仅是将邻居移除,而没有将一开始加入的元素清除,所以需要每次都clear一下,保证是空的。
第四次提交:六十分,这种算法还是太慢,还有待改进(先到此为止,博主改进中……)望大佬赐教更加优的算法和思想。