洛谷P2196 [NOIP 1996 提高组] 挖地雷 题解

本题做法

  • DFS。

思路

在主函数中枚举开始挖的地窖,然后在 DFS 途中不断更新答案及路径,最后输出即可。

代码

#include<bits/stdc++.h>

using namespace std;

const int INF=0x3f3f3f3f;
const double EPS=1e-8;
const int N=25;

long long n,ans,a[N],r[N],cd[N],resr[N],maxk,maxk2;
vector<int> g[N];

void dfs(int t,long long cnt,int k){
	r[k]=t;
	if(cnt>ans){
		ans=cnt;
		maxk=k;
		copy(r+1,r+1+N,cd+1);
	}
	for(int i=0;i<g[t].size();i++){
		if(g[t][i]>t) {
			dfs(g[t][i],cnt+a[g[t][i]],k+1);
		}
	}
	r[k]=0;
}

int main(){
	ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<n;i++){
		for(int j=i+1;j<=n;j++){
			int c;
			cin>>c;
			if(c) g[i].push_back(j);
		}
	}
	long long res=0;
	for(int i=1;i<=n;i++){
		ans=0;
		maxk=0;
		memset(r,0,sizeof(r));
		memset(cd,0,sizeof(cd));
		dfs(i,a[i],1);
		if(ans>res){
			res=ans;
			maxk2=maxk;
			copy(cd+1,cd+1+maxk2,resr+1);
		}
	}
	for(int i=1;i<=maxk2;i++) cout<<resr[i]<<" ";
	cout<<endl<<res<<endl;
	return 0;
}
posted @ 2025-07-06 18:44  2789617221guo  阅读(49)  评论(0)    收藏  举报