蒟蒻求助
查看原帖
蒟蒻求助
392843
Bright_XZJ楼主2021/10/16 10:32
#include<bits/stdc++.h>
using namespace std;
int read(){
	int x,f=1;
	char ch=getchar();
	while(!isdigit(ch)){
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while(isdigit(ch)){
		x=x*10+ch-'0';
	}
	return x*f;
}
int ans[25];//储存结果路径 
int path[25];//储存DFS路径 
bool a[25][25];//储存边是否联通 
int n;//地窖个数 
int num[25];//每个地窖的地雷数量
bool b[25];//检查每个点是否走过
int anw;//储存最多地雷数 
int r;//储存步数 
bool chek(int x){//查看是否还有可走的边 
	for(int i=1;i<=n;i++)	
		if(a[x][i]&&b[i]) return true;
	return false;
} 
void DFS(int x,int temp,int cnt){
/*x储存现在所在的点
  cnt储存结果 	
  temp储存步数*/			 								 	 
	if(!chek(x)){//如果没有可走之路 
		if(cnt>anw){
			anw=cnt;
			r=temp;
			for(int i=1;i<=r;i++){
				ans[i]=path[i]; 
			}
		} 
		return ;
	}
	for(int i=1;i<=n;i++){
		if(a[x][i]&&b[i]){
			b[i]=0;//标记 
			path[temp+1]=i;//记录路径 
			DFS(i,temp+1,cnt+num[i]);
			b[i]=1;//回溯 
		}
	}
	
}
int main (){
	memset(b,1,sizeof(b));
	n=read();
	for(int i=1;i<=n;i++) num[i]=read();
	for(int i=1;i<n;i++)
	for(int j=i+1;j<=n;j++){
		a[i][j]=read();
	}
	for(int i=1;i<=n;i++){
		b[i]=0;
		path[1]=i;
		DFS(i,1,num[i]);
		b[0]=0;
	}
	for(int i=1;i<=r;i++){
	cout<<ans[i]<<" "; 
	}
	cout<<endl;
	cout<<anw;
	return 0;
} 

超时了,不会改,求助

2021/10/16 10:32
加载中...