求救,最后一个超时,有什么办法解决呢?
查看原帖
求救,最后一个超时,有什么办法解决呢?
257318
BugManMax楼主2024/4/30 16:40
#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;
}

使用快读也没办法。问题大概出在循环遍历当前节点下所连接节点,用过的也会再遍历判断一次

2024/4/30 16:40
加载中...