首页 > 其他 > 详细

NOIP1998提高组——挖地雷

时间:2018-08-26 23:17:15      阅读:264      评论:0      收藏:0      [点我收藏+]

【题目描述】:
挖地雷

思路:
水题一道。。
本来是拿来练习\(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\)

NOIP1998提高组——挖地雷

原文:https://www.cnblogs.com/lajioj/p/9539396.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!