NOIP1998提高组——挖地雷

【题目描述】:
挖地雷

思路:
水题一道。。
本来是拿来练习\(DAG\)\(DP\)的,然后想了半天,一怒之下打了暴力A了\(233\)
NAIVE
因为起点不确定,所以应该枚举每一个点为起点,然后去\(dfs\),然后用前驱数组记录路径。。
然后我就觉得没说的了。。

//created by lajioj
#include<cstdio>
using namespace std;

int n;
const int MAXN = 25;
int a[MAXN];

struct edge{
    int u,v,nxt;
}e[MAXN*MAXN];int head[MAXN];int cnt=0;bool vis[MAXN];int maxx = 0;int pre[MAXN];int rel[MAXN];int y = 0;

inline void add(int u,int v){
    e[++cnt].u = u;e[cnt].v = v;e[cnt].nxt = head[u];head[u] = cnt;
}

inline void dfs(int u,int ans){
    vis[u] = 1;
    
    ans += a[u];
    for(int i=head[u];i;i=e[i].nxt){
        int v = e[i].v;
        if(vis[v]) continue;
        pre[v] = u;
        dfs(v,ans);
        vis[v] = 0;
    }
    
    if(ans > maxx){
        maxx = ans;
        y = 0;
        rel[++y] = u;
        for(int i=pre[u];i;i=pre[i]) rel[++y] = i;//这个才是真的路径数组,大则更新
    }
}

int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;++i) scanf("%d",&a[i]);
    for(int i=1;i<=n-1;++i){
        for(int j=i+1;j<=n;++j){
            int x;scanf("%d",&x);
            if(x == 1) add(i,j);
        }
    }
    
    for(int i=1;i<=n;++i) dfs(i,0);
    for(int i=y;i>=1;--i) printf("%d ",rel[i]);puts("");printf("%d",maxx);
    return 0;
} 

\(lajioj\) \(is\) \(so\) \(NAIVE\)

转载于:https://www.cnblogs.com/lajioj/p/9539396.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值