#include<iostream>
#include<vector>
using namespace std;
int n,m;//节点个数和线路
int sum =0;//总路径条数
struct jiedian{//每个节点
bool isup=false;//是否已经用过
bool ist=false;//是否是头节点
vector<int> down;//下面连接了哪些节点,用于后面遍历
};
struct jiedian jd[10005];
void dfs(int d,int step){
if(step==4){//如果最后一步
if(!jd[d].ist)//如果最后一步不是头节点
jd[d].isup = false; //重置最后一节点状态
sum++;
return;//回溯
}
for(int i=0;i<jd[d].down.size();i++){//遍历当前节点下所有连接节点
int next = jd[d].down[i];//下一个节点值
//下一个节点未使用,或者下一步为最后一步同时下一步为头节点
if(!jd[next].isup||(step==3&&jd[next].ist)){
jd[next].isup = true;
dfs(jd[d].down[i],step+1);
}
}
jd[d].isup = false;//重置当前节点状态
return;//回溯
}
int main(){
cin>>n>>m;
int a,b;
for(int i=0;i<m;i++){
cin>>a>>b;
jd[a].down.push_back(b);
jd[b].down.push_back(a);
}
for(int i=1;i<=n;i++){
int step = 1;
jd[i].ist = true;//确定头节点
jd[i].isup = true;//头节点被使用
dfs(i,step);
jd[i].ist = false;//头节点重置
}
cout<<sum;
return 0;
}
使用快读也没办法。问题大概出在循环遍历当前节点下所连接节点,用过的也会再遍历判断一次