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\)

posted @ 2018-08-26 22:54  lajioj  阅读(257)  评论(0编辑  收藏  举报