P2196 [NOIP1996 提高组] 挖地雷

P2196 [NOIP1996 提高组] 挖地雷

这是一道经典的深度优先搜索(DFS)问题,旨在寻找一种挖地雷的策略,使得挖到的地雷总数最大。下面是对该题目的详细题解。

输入处理:

第 1 行只有一个数字,表示地窖的个数 N。第 2 行有 N 个数,分别表示每个地窖中的地雷个数。第 3 行至第N+1 行表示地窖之间的连接情况,用图的邻接矩阵存储。

DFS函数:

使用深度优先搜索来遍历图,并尝试找到所有可能的连通子图。

输出处理:

第一行输出最大路径下每一个经过的点的值,第二行输出最大路径下每一个经过的点的值的和。

下面是我的代码:

点击查看代码
#include<bits/stdc++.h>
using namespace std;
int n,a[21],b[21][21],sum,ma=-1,cnt=1,ans[21],x,ans1[21],temp,s,m=-1;
void dfs(int i){
	ans[cnt]=i;
	if(sum>ma){
		ma=sum;
		temp=cnt;
		for(int i=1;i<=cnt;i++){
			ans1[i]=ans[i];
		}
	}
	for(int j=1;j<=n;j++){
		if(b[i][j]==1){
			cnt++,sum+=a[j],dfs(j),cnt--,sum-=a[j];
		}
	}
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	for(int i=1;i<n;i++){
		for(int j=1;j<=n-i;j++){
			cin>>x;
			if(x==1){
				b[i][i+j]=1;
			}
		}
	}
	for(int i=1;i<=n;i++){
		sum=a[i];
		dfs(i);
		if(ma>m){
			s=i;
		}
	} 
	dfs(s);
	for(int i=1;i<=temp;i++){
		cout<<ans1[i]<<" ";
	}
	cout<<endl;
	cout<<ma;
	return 0;
} 
posted @   圣川·王  阅读(23)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示