蓝桥---网络寻路(DFS)

蓝桥---网络寻路(DFS)

Description

X 国的一个网络使用若干条线路连接若干个节点。节点间的通信是双向的。某重要数据包,为了安全起见,必须恰好被转发两次到达目的地。该包可能在任意一个节点产生,我们需要知道该网络中一共有多少种不同的转发路径。
源地址和目标地址可以相同,但中间节点必须不同。

如下图所示的网络。

 

 

1 -> 2 -> 3 -> 1 是允许的
1 -> 2 -> 1 -> 2 或者 1 -> 2 -> 3 -> 2 都是非法的。
 

Input

输入数据的第一行为两个整数N M,分别表示节点个数和连接线路的条数(1<=N<=10000; 0<=M<=100000)。
接下去有M行,每行为两个整数 u 和 v,表示节点u 和 v 联通(1<=u,v<=N , u!=v)。
输入数据保证任意两点最多只有一条边连接,并且没有自己连自己的边,即不存在重边和自环。

Output

输出一个整数,表示满足要求的路径条数。

Sample Input

3 3
1 2
2 3
1 3

Sample Output

6

样例输入2

4 4
1 2
2 3
3 1
1 4

样例输出2

10

 

 

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <iostream>
 4 #include <string>
 5 #include <math.h>
 6 #include <algorithm>
 7 #include <vector>
 8 #include <stack>
 9 #include <queue>
10 #include <set>
11 #include <map>
12 #include <sstream>
13 const int INF=0x3f3f3f3f;
14 typedef long long LL;
15 const double eps =1e-8;
16 const int mod=1e9+7;
17 const int maxn=1e6+10;
18 using namespace std;
19  
20 vector<int> vt[10005];
21 LL ans;
22  
23 void DFS(int u,int step,int fa)
24 {
25     if(step==3)
26     {
27         ans++;
28         return;
29     }
30     for(int i=0;i<vt[u].size();i++)
31     {
32         int v=vt[u][i];
33         if(v!=fa) DFS(v,step+1,u); 
34     }
35     return ;
36 }
37  
38 int main()
39 {
40     #ifdef DEBUG
41     freopen("sample.txt","r",stdin);
42     #endif
43      
44     int n,m;
45     scanf("%d %d",&n,&m);
46     for(int i=1;i<=m;i++)
47     {
48         int u,v;
49         scanf("%d %d",&u,&v);
50         vt[u].push_back(v);
51         vt[v].push_back(u);
52     }
53     for(int i=1;i<=n;i++)
54         DFS(i,0,0);
55     printf("%lld\n",ans);
56      
57     return 0;
58 }

 

 

-

posted @ 2020-02-16 22:10  jiamian22  阅读(243)  评论(0编辑  收藏  举报