60求调
查看原帖
60求调
1185284
Linktux楼主2025/6/27 21:22
#include <bits/stdc++.h>
using namespace std;
int n,a[25],ans=-1,f[25];//f记录到这个点最多多少个地雷
bool b[25][25];
int curr[25],pt=0,route[25],len=0;
void save(){
    for(int i=1;i<=pt;i++)route[i]=curr[i];
    len=pt;
    return;
}//记录最短路径
void dfs(int p,int cur){
	cur+=a[p];
    if(cur<=f[p])return;//剪枝
    f[p]=cur;
    curr[++pt]=p;
    bool flag=true;
    for(int i=p+1;i<=n;i++){
        if(b[p][i]){
            dfs(i,cur);
            flag=false;
        }
    }
    if(flag){//走到了尽头
        ans=cur;
        save();
    }
    --pt;
}
int main(){
    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++){
        cin>>b[i][j];
    }
    memset(f,0,sizeof(f)); 
    for(int i=1;i<=n;i++){
        if(f[i]==0)dfs(i,0);
    }
    for(int i=1;i<=len;++i)cout<<route[i]<<"\n "[i!=len];
    cout<<ans<<endl;
    return 0;
}
2025/6/27 21:22
加载中...