zoukankan      html  css  js  c++  java
  • 挖地雷

    题目描述

    在一个地图上有N个地窖(N20),每个地窖中埋有一定数量的地雷。同时,给出地窖之间的连接路径。当地窖及其连接的数据给出之后,某人可以从任一处开始挖地雷,然后可以沿着指出的连接往下挖(仅能选择一条路径),当无连接时挖地雷工作结束。设计一个挖地雷的方案,使某人能挖到最多的地雷。

    输入格式

    有若干行。

    1行只有一个数字,表示地窖的个数N。

    2行有N个数,分别表示每个地窖中的地雷个数。

    3行至第N+1行表示地窖之间的连接情况:

    3行有n1个数(0或1),表示第一个地窖至第2个、第3个、…、第n个地窖有否路径连接。如第3行为1 1 0 0 0 … 0,则表示第1个地窖至第2个地窖有路径,至第3个地窖有路径,至第4个地窖、第5个、…、第n个地窖没有路径。

    4行有n-2个数,表示第二个地窖至第3个、第4个、…、第n个地窖有否路径连接。

    … …

    n+1行有1个数,表示第n-1个地窖至第n个地窖有否路径连接。(为0表示没有路径,为1表示有路径)。

    输出格式

    有两行

    第一行表示挖得最多地雷时的挖地雷的顺序,各地窖序号间以一个空格分隔,不得有多余的空格。

    第二行只有一个数,表示能挖到的最多地雷数。

    输入输出样例

    输入 #1
    5
    10 8 4 7 6
    1 1 1 0
    0 0 0
    1 1
    1
    输出 #1
     
    1 3 4 5
    27


    分析:
    本题依然可以进行dfs,由于n<=20,dfs显然不会超时,故选取每一个点,对其下一个点进行dfs即可

    CODE:
     1 #include<cmath>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<iostream>
     5 #include<algorithm>
     6 using namespace std;
     7 const int M=1005;
     8 int n,a[M];
     9 int head[M],next[M],to[M],tot;
    10 int get(){
    11     int res=0,f=1;
    12     char c=getchar();
    13     while (c>'9'||c<'0') {
    14         if (c=='-') f=-1;
    15         c=getchar();
    16     }
    17     while (c<='9'&&c>='0'){
    18         res=(res<<3)+(res<<1)+c-'0';
    19         c=getchar();
    20     }
    21     return res*f;
    22 }
    23 void add(int u,int v){
    24     next[++tot]=head[u];
    25     head[u]=tot;
    26     to[tot]=v;
    27     return ;
    28 }
    29 int ans;
    30 int f[M],ansl[M],cnt;
    31 bool flag;
    32 void dfs(int u,int tot,int now){
    33     if (tot>ans) {
    34         flag=true;
    35         ans=tot;
    36         for (int i=1;i<=now;i++) ansl[i]=f[i];
    37         cnt=now;
    38     }
    39     for (int i=head[u];i;i=next[i]){
    40         int v=to[i];
    41         f[now]=v;
    42         dfs(v,tot+a[v],now+1);
    43         f[now]=0;
    44     }
    45     return ;
    46 }
    47 int main(){
    48     n=get();
    49     for (int i=1;i<=n;i++) a[i]=get();
    50     for (int i=1;i<=n;i++){
    51         for (int j=i+1;j<=n;j++){
    52             int ok=get();
    53             if (ok) add(i,j);
    54         }
    55     }
    56     for (int i=1;i<=n;i++){
    57         flag=false;
    58         dfs(i,a[i],2);
    59         if (flag) ansl[1]=i,f[1]=i;
    60     }
    61     for (int i=1;i<cnt;i++) printf ("%d ",ansl[i]);
    62     printf ("
    %d",ans);
    63     return 0;
    64 }
    
    
    
     
  • 相关阅读:
    4.22 每日一题题解
    4.21 每日一题题解
    4.20 每日一题题解
    【HDU2825】Wireless Password【AC自动机,状态压缩DP】
    【POJ2778】DNA Sequence 【AC自动机,dp,矩阵快速幂】
    【ZOJ 3228】Searching the String 【AC自动机】
    【LA5135 训练指南】井下矿工 【双连通分量】
    【LA3523 训练指南】圆桌骑士 【双连通分量】
    【LA3713 训练指南】宇航员分组 【2-sat】
    【LA3211 训练指南】飞机调度 【2-sat】
  • 原文地址:https://www.cnblogs.com/kanchuang/p/11337834.html
Copyright © 2011-2022 走看看