先用vecor记录边,v[i]记录的是从i直接相连所到的点 ,然后进入dfs遍历所有能够到达的点,因为最后一个点可以到达原来发源的点,所以我们需要特判一下已经走过的点,v[i] ,当层数等于3的时候,我们只需要填最后一个数的时候,我们遍历一下,看看能不能到发源点。
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std ;
const int N = 1e4+10 ;
vector<int> a[N] ;//记录每一个点i所有能到达的边
int n , m ;
int cnt ;
int v[N] ;//记录是否已经走过
void dfs(int u,int now,int start){
if(u == 4){//层数满了,有一个合法的点,返回值+1 ,返回 。
cnt ++ ;return ;
}
for(int i = 0 ; i < a[now].size() ; i ++){
if(!v[a[now][i]] ){//正常的排列
v[a[now][i]] = 1 ;
//path[u] =
dfs(u+1 , a[now][i],start) ;
v[a[now][i]] = 0 ;
}
if(v[a[now][i]] && u== 3 && a[now][i] == start){//这里特判一下,如果下一个点是发源点,那就可以走
dfs(u+1 , a[now][i],start) ;
}
}
}
int main(){
cin >> n >> m ;
while(m--){
int x , y ;
cin >> x >> y ;//是有向边,将两个都相互压入数组
a[x].push_back(y) ;
a[y].push_back(x) ;
}
for(int i = 1 ; i <= n ; i++){
memset(v,0,sizeof(v)) ;
v[i] = 1 ;
path[0] = i ;
dfs(1,i,i);
}
cout << cnt << endl ;
}