蓝桥杯 网络寻路 JAVA 非满分做法

问题描述

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

思路

深搜+记步长,但是最后会超时。

 1 package LanQiao;
 2 
 3 import java.util.*;
 4 public class 网络寻路 {
 5 
 6     static int n,m;
 7     static int u,v;
 8     static int[][] map;
 9     static boolean vis[]= {false};
10     static int res=0;
11     
12     public static void dfs(int start,int end,int count) {
13         if(count==3) {
14             if(start==end) {res++;}
15             return;
16         }
17         if(start==end && count!=0) return;
18         for(int i=1;i<=n;i++) {
19             if(map[start][i]==1 && (vis[i]==false || i==end)) {
20                 vis[i]=true;
21                 dfs(i,end,count+1);
22                 vis[i]=false;
23             }
24         }
25     }
26     
27     public static void getResult() {
28         for(int i=1;i<=n;i++) {
29             for(int j=1;j<=n;j++) {
30                 vis[i]=true;
31                 dfs(i,j,0);
32                 vis[i]=false;
33             }
34         }
35         System.out.println(res);
36     }
37     
38     public static void main(String[] args) {
39         // TODO Auto-generated method stub
40         Scanner scan=new Scanner(System.in);
41         n=scan.nextInt();
42         m=scan.nextInt();
43         map=new int[n+1][n+1];
44         vis=new boolean[n+1];
45         for(int i=0;i<m;i++) {
46             u=scan.nextInt();
47             v=scan.nextInt();
48             map[u][v]=1;
49             map[v][u]=1;
50         }
51         getResult();
52     }
53 
54 }

 

posted @ 2021-04-11 22:00  歪你的糖掉了  阅读(84)  评论(0)    收藏  举报