先用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 ; }