洛谷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;
}

浙公网安备 33010602011771号