问题描述
X 国的一个网络使用若干条线路连接若干个节点。节点间的通信是双向的。某重要数据包,为了安全起见,必须恰好被转发两次到达目的地。该包可能在任意一个节点产生,我们需要知道该网络中一共有多少种不同的转发路径。
源地址和目标地址可以相同,但中间节点必须不同。
如下图所示的网络。
1 -> 2 -> 3 -> 1 是允许的
1 -> 2 -> 1 -> 2 或者 1 -> 2 -> 3 -> 2 都是非法的。
输入格式
输入数据的第一行为两个整数N M,分别表示节点个数和连接线路的条数(1<=N<=10000; 0<=M<=100000)。
接下去有M行,每行为两个整数 u 和 v,表示节点u 和 v 联通(1<=u,v<=N , u!=v)。
输入数据保证任意两点最多只有一条边连接,并且没有自己连自己的边,即不存在重边和自环。
输出格式
输出一个整数,表示满足要求的路径条数。
样例输入1
3 3
1 2
2 3
1 3
样例输出1
6
样例输入2
4 4
1 2
2 3
3 1
1 4
样例输出2
10
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class 网格寻路 {
public static int sum=0;
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner=new Scanner(System.in);
int i,qiDian,zhongDian;
List<WangNode> jiHe;
int nodeShu=scanner.nextInt();
int bianShu=scanner.nextInt();
WangNode[] wangNodes=new WangNode[nodeShu];
for(i=0;i<nodeShu;i++){
wangNodes[i]=new WangNode(i+1);
}
for(i=0;i<bianShu;i++){
qiDian=scanner.nextInt()-1;
zhongDian=scanner.nextInt()-1;
wangNodes[qiDian].jieDian.add(wangNodes[zhongDian]);
wangNodes[zhongDian].jieDian.add(wangNodes[qiDian]);
}
for(i=0;i<nodeShu;i++){
jiHe=new ArrayList<WangNode>();
jiHe.add(wangNodes[i]);
search(wangNodes[i],jiHe);
jiHe.clear();
}
System.out.println(sum);
}
public static void search(WangNode qiDian,List<WangNode> jiHe){
List<WangNode> jiHeTemp=new ArrayList<WangNode>(jiHe);
WangNode lastNode;
try {
lastNode = jiHe.get(jiHeTemp.size()-2);
} catch (Exception e) {
lastNode=null;
}
int i;
for(i=0;i<qiDian.jieDian.size();i++){
if(!qiDian.jieDian.get(i).equals(lastNode)){
jiHeTemp.add(qiDian.jieDian.get(i));
if(jiHeTemp.size()==4){
sum+=1;
for(WangNode wangNode:jiHeTemp){
System.out.print(wangNode.value+" ");
}
System.out.println();
}else{
search(qiDian.jieDian.get(i),jiHeTemp);
}
jiHeTemp.remove(jiHeTemp.size()-1);
}
}
}
}
class WangNode{
int value;
List<WangNode> jieDian=new ArrayList<WangNode>();
public WangNode(int value) {
// TODO Auto-generated constructor stub
this.value=value;
}
}
5条测试,其中有一条超时,我知道超时问题所在,但是不知道如何去解决,例如1-2-3-4有了就不必再寻找4-3-2-1,但是不知道怎么去解决
网友评论